69

Python 2'deki bir işlev çağrısında değişken uzunluklu konumsal parametrelerden sonra adlandırılmış parametreleri kullanabileceğimi düşündüm, ancak bir python sınıfını içe aktarırken bir SyntaxError aldım. Ben örneğin, aşağıdaki "get" yöntemi ile yazıyorum:Python, değişken uzunluk konum argümanlarından sonra varsayılan anahtar kelime argümanları

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 gibi görünür:

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

ben yöntemi çeşitli yollar arama yapabilmek istiyorum:

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

vb

cevap

61
O çalışır

, ancak yalnızca Python 3. Bkz PEP 3102 içinde. "Yeni olan" belgelere bakmadan, 2.x backport yok gibi görünüyor, bu yüzden şanssızsınız. Herhangi bir anahtar kelime argümanını (**kwargs) kabul etmeniz ve manuel olarak ayrıştırmanız gerekir. d.get(k, default)'u, yoksa, d[k] veya default'u kullanabilirsiniz. Bir bağımsız değişkeni kwargs'dan kaldırmak için, ör. Bir süper sınıf 'yöntemini çağırmadan önce d.pop kullanın. def get(self, *args, raw=False, vars=None): yılında, raw=False ve vars=None kelime argümanları ile ilgisi olduğunu


Not. Bunlar varsayılan argüman değerleridir. varsayılan bir değerle Argümanlar pozisyonel olarak aktarılabilir ve bir varsayılan değeri olmayan argümanlar Anahtar kelime ile aktarılabilir:

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, anahtar kelime sadece argümanlar varsayılan bir değere sahip gerekmez.

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

İkinize de iminiz ve İmran! İmzan'ın kod bloğu ve doktor önerisi ile cevabınız soruyu mükemmel bir şekilde yanıtladı. – jkmacc

41

Python'un sözdizimi aynı anda fonksiyonu ve varsayılan değere sahip anahtar kelime argümanlar değişken args izin vermez: *args tartışma sonrasında Coming anahtar kelime sadece varsayılan bir değerin değil varlığı olarak işaretler şeydir. Anahtar kelime argümanlarının rastgele sayıdaki konumsal argümanlarla birlikte olması gerekiyorsa, anahtar kelime argümanlarının da keyfi sayısına izin vermeniz gerekir.

Bu yaygın bir anahtar kelime argümanlar için varsayılan değerler sağlamak için desen yanı sıra pozisyonel istenen sayıda argümanı izin şudur: hiç ekstra anahtar kelime argümanları kullanmak istemiyorsanız

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

, hiçbir şeye sahip Hakkında endişelenmek. Bu işlev, düzgün yazılmış bir belge ile telafi edebileceğiniz, biraz daha az kendi kendini belgeleyen yapar.