2011-07-28 22 views
7

Tôi đang cố gắng mở rộng một phương thức với một đối số từ khóa duy nhất trong khi vẫn còn vô tư với phần còn lại của chữ ký của phương thức; Tôi chỉ muốn vượt qua điều đó. Cố gắng 0:Python: Thành ngữ thanh lịch để mở rộng phương thức bằng một hoặc nhiều đối số từ khóa là gì?

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) 

này không hoạt động:

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' 

tôi hoàn toàn hiểu tại sao ở trên không làm việc, nhưng tôi đang tìm kiếm một cách tốt đẹp để làm cho nó làm việc. Đây là hiện tại của tôi (xấu xí) workaround:

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) 

Kết quả là 3 dòng cruft mỗi kwarg ...

Trả lời

6

Tôi muốn sử dụng dict.pop(), như vậy:

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) 

Khi chạy, điều này in ra:

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

Bạn có thể sử dụng {}.pop() để chuyển 3 dòng của bạn thành 1:

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

Tôi nghĩ điều này cũng hoạt động: my_kwarg = kwargs.pop ('my_kwarg', 42) – FredL

Các vấn đề liên quan