Python, değişken uzunluklu konumsal argümanlardan sonra varsayılan anahtar kelime argümanları


82

Python 2'de bir işlev çağrısında değişken uzunluklu konumsal parametrelerden sonra adlandırılmış parametreleri kullanabileceğimi düşündüm, ancak SyntaxErrorbir python sınıfını içe aktarırken bir alıyorum . Aşağıdaki "get" yöntemiyle yazıyorum, örneğin:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

Hata şuna benzer:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

Yöntemi birkaç şekilde adlandırabilmek istiyorum:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

vb.

Yanıtlar:


71

Çalışır , ancak yalnızca Python 3'te. Bkz. PEP 3102 . "Yenilikler" belgelerine bakıldığında, 2.x arka port yokmuş gibi görünüyor, bu yüzden şansınız yok. Anahtar kelime argümanlarını ( **kwargs) kabul etmeniz ve manuel olarak ayrıştırmanız gerekir. d.get(k, default)Ya almak için ya d[k]da defaultorada değilse kullanabilirsiniz . Bir argümanı kaldırmak için kwargs, örneğin bir süper sınıf 'yöntemini çağırmadan önce kullanın d.pop.


İçinde def get(self, *args, raw=False, vars=None):, raw=Falseve vars=Noneanahtar sözcük bağımsız değişkenleriyle hiçbir ilgisi olmadığını unutmayın. Bunlar varsayılan bağımsız değişken değerleridir. Varsayılan bir değere sahip bağımsız değişkenler konumsal olarak iletilebilir ve varsayılan değeri olmayan bağımsız değişkenler anahtar kelime tarafından iletilebilir:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

Benzer şekilde, yalnızca anahtar kelime bağımsız değişkenlerinin varsayılan bir değere sahip olması gerekmez. Bağımsız *argsdeğişkenden sonra gelen , onları yalnızca anahtar kelime olarak işaretleyen şeydir, varsayılan bir değerin varlığı değil:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

Hem sana hem de İmran'a teşekkürler! İmran'ın kod bloğu ve docstring önerisiyle cevabınız soruyu mükemmel bir şekilde cevapladı.
jkmacc

50

Python'un sözdizimi, işlevde değişken argümanlara ve aynı zamanda varsayılan değeri olan anahtar kelime argümanlarına izin vermez. Keyfi sayıda konumsal argümanla birlikte anahtar kelime argümanlarına sahip olmanız gerekiyorsa, keyfi sayıda anahtar kelime argümanına da izin vermeniz gerekir.

Bu, anahtar kelime argümanları için varsayılan değerler sağlamanın yanı sıra herhangi bir sayıda konumsal argümana izin veren yaygın bir modeldir:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

Ekstra anahtar kelime argümanlarını hiç kullanmazsanız, endişelenecek bir şeyiniz yoktur. Bu, işlevi, düzgün bir şekilde yazılmış bir dokümantasyon ile telafi edebileceğiniz, kendi kendini belgelemeyi biraz daha az hale getirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.