2011-07-28 19 views
7

Bir yöntemin imzasının geri kalanı için tarafsız kalırken, tek bir anahtar kelime argümanıyla bir yöntemi genişletmeye çalışıyorum; Sadece bunu geçmek istiyorum. Denemesi 0:Python: Bir veya daha fazla anahtar kelime argümanıyla genişletme yöntemi için zarif bir deyim nedir?

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) 

Bu işe yaramazsa:

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' 

yukarıda çalışmıyor neden tamamen anlıyorum ama o iş yapmak için güzel yol arıyorum. kwarg başına cruft 3 çizgilerini var

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) 

...

cevap

6

Öyle gibi dict.pop() kullanırsınız:

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) 

çalıştırdığınızda, bu Bu benim şimdiki (çirkin) geçici bir çözümdür yazdırır:

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
Sen 1 içine cruft sizin 3 çizgilerini açmak için {}.pop() kullanabilirsiniz

:

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

Bunun da işe yaradığını düşünüyorum: my_kwarg = kwargs.pop ('my_kwarg', 42) – FredL

İlgili konular