将函数的所有参数传递给另一个函数

17

我希望有一个类,可以创建它的子类,并具有仅在特定条件下打印的打印功能。

这就是我想做的事情:

class ClassWithPrintFunctionAndReallyBadName:
    ...
    def print(self, *args):
        if self.condition:
            print(*args)

除了默认的print函数中必须明确声明的参数,例如end(例如:print('Hello, world!', end='')),此方法已经可以工作。 我该如何使我的新类的print函数接受像end =''这样的参数,并将它们传递给默认的print


3
你可以使用 **kwargs - John Coleman
5个回答

34

传递所有参数的标准方法是如@JohnColeman在评论中建议的方式:

class ClassWithPrintFunctionAndReallyBadName:
    ...
    def print(self, *args, **kwargs):
        if self.condition:
            print(*args, **kwargs)

*args作为参数接收非关键字(位置)参数元组,**kwargs是关键字参数的字典。

在使用***调用函数时,前面的元组会像单独传递参数一样展开,而后面的字典则按照关键字参数的形式展开。


13

我知道它看起来有点丑,但它完美地工作,如果你正在使用许多关键字参数并且只想为另一个方法构建一个外观:

def print(self, print_message, end='\n', sep=' ', flush=False, file=None):
    if self.condition:
        print(**{key: value for key, value in locals().items() if key != 'self'})

虽然这需要写很多样板代码,但它避免了任何参数语句的重复。

你也可以考虑使用装饰器来使条件部分更符合Python风格。但要注意,装饰器在类实例化之前只检查一次条件。


3
在字典推导的筛选部分中,key in selfsseelf等变量名上存在误报,应该改为key != 'self' - DimG
是的,你说得对。我疏忽了这个问题。可能是在生产代码编写时输入更多的元组。 - CheradenineZK

4

只需复制方法签名中的命名参数即可。

def print(self, *args, end='\n', sep=' ', flush=False, file=None):
    if self.condition:
        print(*args, end=end, sep=sep, flush=flush, file=file)

如果有人告诉我这个答案哪里出了问题,以至于值得被踩,我会很愿意修复这些问题。 - TigerhawkT3
你的答案对于手头的问题来说很好。有时很难理解为什么会被踩。 - John Coleman
被随机踩的人感到困惑 :< 我觉得如果你不喜欢某个东西,你必须发表评论,如果没有评论,否则它就像“我的代码不起作用”的问题一样没有帮助。 - A. L
2
@TigerhawkT3,与args和kargs解决方案相比,您的答案不够通用。因此最好在这些解决方案之后向用户展示它。这可能是被投票反对的原因。 - pembeci

2
class List(list):
    def append_twice(self, *args, **kwargs):
        self.append(*args, **kwargs)
        self.append(*args, **kwargs)

l = List()
l.append_twice("Hello")
print(l) # ['Hello', 'Hello']

1
在结尾添加如下内容:

像这样添加

def print(self, *args, end=''):

如果参数是动态的或太多:
 def print(self, *args, **kwargs):

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接