2011-07-28 18 views
7

我试图用一个关键字参数来扩展一个方法,同时保持对方法签名的其余部分的公正;我只想通过它。尝试0:Python:用一个或多个关键字参数来扩展方法的优雅成语是什么?

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) 

这不起作用:

Traceback (most recent call last): 
    File "test.py", line 9, in <module> 
    SomeClass().some_method('arg 0', 'arg 1', some_kwargs=5, my_kwarg=8) 
TypeError: some_method() got multiple values for keyword argument 'my_kwarg' 

我完全理解为什么上面没有工作,但我正在寻找一个很好的方式,使其工作。这是我目前(丑)解决方法:

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行,每kwarg克鲁夫特的...

回答

6

我会用dict.pop(),就像这样:

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) 

运行时,此打印出:

SomeClass: my_kwarg=8 
SomeSuperclass: args=('arg 0', 'arg 1') kwargs={'some_kwargs': 5} 
SomeClass: my_kwarg=42 
SomeSuperclass: args=('arg 0', 'arg 1') kwargs={'some_kwargs': 5} 
1

您可以使用{}.pop()将您的3条粗线变为1:

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

我认为这也适用:my_kwarg = kwargs.pop('my_kwarg',42) – FredL

相关问题