2013-08-26 12 views
5

yine bir köşeye kendimi eğitimi atma? Görünüşe göre, 'normal' değişkenleri * değişkenleriyle karıştırmamalısınız, ancak bunu onaylamak veya reddetmek için kimseyi bulamıyorum. Bir yerde okudum (ve şu anda elbette bulamıyorum), bazı argüman türlerinin ilk önce gelmesi gerektiğine inanıyorum, bu da benim tartışmamın bir parçası olan veya olmayabilecek anahtar kelime argümanlarına inanıyorum.fonk (* args ** kwargs, x) nedir kural Im burada kırma</p> <pre><code>def superfunction(*args, **kwargs, k): ^ SyntaxError: invalid syntax </code></pre> <p>... geçersiz sözdizimi

+0

Bunun tam olarak niçin yanlış olduğunun ayrıntıları Python 2.x ve 3.x arasında biraz farklıdır; [Keyword Arguments] [Keyword Arguments] (http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments) ve referans bölümü [İşlev tanımları] (http://docs.python.org/ Uygun sürüm için 2/reference/compound_stmts.html # function) detaylara sahip. Ama kısaca, '' 'parametresinden sonra hiçbir şey gelemez. – abarnert

+0

Ayrıca, tüm ayrıntıları açıklayan bir [blog gönderisi] (http://stupidpythonideas.blogspot.com/2013/08/arguments-and-parameters.html) aldım; Hiç acemi dostu olduğunu sanmıyorum… ama umarım referans dokümanları okumaktan en azından biraz daha kolay olur. (Bu, Python 3'e özgüdür, ancak.) – abarnert

cevap

13

bu deneyin:

def superfunction(k, *args, **kwargs): 

**kwargs değişken anahtar kelime parametresini işlev bildiriminde son parçası olmalıdır. İkinci uçtan, *args değişken pozisyon parametresi. (Sadece Python 3.x'te, yalnızca *args ve **kwargs arasında yalnızca anahtar kelime parametrelerine sahip olabilirsiniz.) Ve ilk yerlerde konumsal parametreler - bu, işlev parametrelerini bildirmenin doğru yoludur. Daha fazla ayrıntı için bu post'a bir göz atın.

Tam referans için, Python 3.x veya Python 2.x'daki İşlev tanımları bölümüne bakın.

+1

böylece adlandırılmamış vars, vars adı, *, ** – jason

+0

Çalışmak için alabildiğim tek sıra def işlevsiz (k, n = 2, * args, **) kwargs): Beni doğru yola koyduğun için teşekkür ederim. – jason

+0

followup: def süperfonu (k, n = 2, * args, * args2, ** kwargs): Çoklu * tür argümanlara sahip olmak da bir yazım hatası verir. Sanırım sadece bir tanesine izin verdi mi? – jason

4

dizimi böyle olmalı:

def superfunction(k, *args, **kwargs): 

Önce tüm pozisyonel sonra argümanları olmayan kelime argümanları ve ardından anahtar kelime argümanlar vermek.

+0

'da mümkündür. Ayrıca, argüman ve parametrelerin yanlış olmasının yanı sıra… anahtar kelime olmayan argümanlar ve konumsal argümanlar da aynı şeydir, bu yüzden kafa karıştırıcı ve yanlıştır. – abarnert

+0

Doğru sıra: konumsal veya anahtar kelime paramları, daha sonra isteğe bağlı olarak * * args' (veya '*', sadece Python 3.x'te), sonra (yalnızca Python 3.x'te) yalnızca anahtar parazitleri, sonra '* * kwargs'. – abarnert

+0

@abarnert Ah! Bu mu? Birkaç ay önce okudum, bu yüzden teknik terimini ve dolayısıyla bir karışımı unutmuşum gibi görünüyor. Bunu işaret ettiğin için teşekkürler. –

İlgili konular