Çoğu cevap bunu söylerken, örneğin,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
aynıdır"
def f(foo=None, bar=None, **kwargs):
...etc...
Bu doğru değil. İkinci durumda, f
olarak adlandırılabilir f(23, 42)
eski vaka argümanlar adlı kabul eder iken, yalnızca hiçbir konumsal aramaları -. Genellikle arayanın maksimum esnekliğine izin vermek istersiniz ve bu nedenle çoğu cevap iddia edildiği gibi ikinci form tercih edilir: ancak bu her zaman böyle değildir. Tipik olarak sadece birkaçı geçirilen birçok isteğe bağlı parametreyi kabul ettiğinizde, adlandırılmış argümanların kullanımını zorlamak mükemmel bir fikir olabilir (çağrı sitelerinizdeki kazalardan ve okunamayan kodlardan kaçınmak!) - threading.Thread
bir örnektir. İlk form Python 2'de bunu nasıl uyguladığınızdır.
Tek bir sonraki her argüman: deyim Python 3'te şimdi özel destek sözdizimi olduğunu çok önemlidir *
içinde def
imza anahtar kelime sadece olduğunu, bir konumsal argüman olarak geçilemeyen, ancak yalnızca adlandırılmış biri gibidir. Python 3'te yukarıdakileri şu şekilde kodlayabilirsiniz:
def f(*, foo=None, bar=None, **kwargs):
...etc...
Nitekim, Python 3'te bile argümanları yalnızca anahtar kelime olabilir değil (varsayılan değeri olmayan olanlar) isteğe bağlı.
Ancak, Python 2 hala önde üretken yaşamın uzun yıllar var, bu daha iyidir, böylece değil Python 2 doğrudan Python 3 dilde desteklenmektedir önemli tasarım fikirleri uygulamak izin teknikleri ve deyimleri unutun!