簡體   English   中英

Python:使用一個或多個關鍵字參數擴展方法的優雅習慣是什么?

[英]Python: What is an elegant idiom for extending method with one or more keyword arguments?

我正在嘗試使用單個關鍵字參數擴展方法,同時保持對方法的其余部分的公正性; 我只是想傳遞它。 嘗試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)

這不起作用:

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)

這是每個kwarg 3條線路......

我會使用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}

您可以使用{}.pop()將3行殘差變為1:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM