Python:用一个或多个关键字参数扩展方法的优雅习惯用法是什么?

2024-05-13 04:48:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个关键字参数扩展一个方法,同时保持对方法签名的其余部分保持公正;我只想传递它。尝试0:

class SomeSuperclass(object):
    pass # in reality: some implementation for some_method

class SomeClass(SomeSuperclass):
    def some_method(self, my_kwarg=42, *args, **kwargs):
        super(SomeClass, self).some_method(*args, **kwargs)
        do_something_interesting_with(my_kwarg)

SomeClass().some_method('arg 0', 'arg 1', some_kwargs=5, my_kwarg=8)

这不起作用:

^{pr2}$

我完全理解为什么上面的方法不起作用,但我正在寻找一个好的方法使它发挥作用。这是我目前(丑陋的)解决方法:

class SomeClass(SomeSuperclass):
    def some_method(self, *args, **kwargs):
        my_kwarg = kwargs.get('my_kwarg', 42) 
        if 'my_kwarg' in kwargs:
            del kwargs['my_kwarg']
        super(SomeClass, self).some_method(*args, **kwargs)
        do_something_interesting_with(my_kwarg)

那是每夸克3行粗汽油。。。在


Tags: 方法inselfmydefargssomedo
2条回答

您可以使用{}.pop()将3行cruft转换为1:

my_kwarg = kwargs.pop('my_kwarg', 42)

我将使用^{},如下所示:

class SomeSuperclass(object):
  def some_method(self, *args, **kwargs):
    print 'SomeSuperclass: args=%s kwargs=%s' % (args, kwargs)

class SomeClass(SomeSuperclass):
  def some_method(self, *args, **kwargs):
    my_kwarg = kwargs.pop('my_kwarg', 42) # 42 is the default
    print 'SomeClass: my_kwarg=%s' % my_kwarg
    super(SomeClass, self).some_method(*args, **kwargs)

SomeClass().some_method('arg 0', 'arg 1', some_kwargs=5, my_kwarg=8)
SomeClass().some_method('arg 0', 'arg 1', some_kwargs=5)

运行时,会打印出:

^{pr2}$

相关问题 更多 >