Varsayılan olmayan bağımsız değişkenler neden varsayılan bağımsız değişkenleri izleyemiyor?


138

Neden bu kod parçası bir SyntaxError atıyor?

  >>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
... 
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

Aşağıdaki kod parçası görünür hatalar olmadan çalışır:

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

Python'da bir fonksiyon tanımladığınızda yapının şekli budur def myfunction(position_arguments, *arguments, **keywords):.... ....
abhishekgarg

Yanıtlar:


172

Gerekli tüm parametreler, varsayılan bağımsız değişkenlerden önce yerleştirilmelidir. Sadece zorunlu oldukları için varsayılan argümanlar zorunlu değildir. Sözdizimsel olarak, tercümanın karışık modlara izin verilirse hangi değerlerin hangi argümanlarla eşleşeceğine karar vermesi imkansızdır . SyntaxErrorArgümanlar doğru sırada verilmezse A oluşturulur :

Fonksiyonunuzu kullanarak anahtar kelime argümanlarına bir göz atalım.

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

Yukarıdaki gibi işlev bildirmesine izin verildiğini varsayalım, Sonra yukarıdaki bildirimlerle, aşağıdaki (normal) konumsal veya anahtar kelime bağımsız değişken çağrılarını yapabiliriz:

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

İşlev çağrısında değişkenlerin atanmasını nasıl önereceksiniz, varsayılan bağımsız değişkenlerin anahtar kelime bağımsız değişkenleriyle birlikte nasıl kullanılacağı.

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

Referans O'Reilly - Core-Python
Bu fonksiyon yukarıdaki fonksiyon çağrıları için sözdizimsel olarak doğru olan varsayılan argümanları kullanır. Çağıran anahtar kelime bağımsız değişkenleri, sıra dışı konumsal bağımsız değişkenler sağlayabildiği için yararlı olduğunu kanıtlar, ancak varsayılan bağımsız değişkenlerle birlikte, eksik bağımsız değişkenleri "atlamak" için de kullanılabilir.


4
<q> Sözdizimsel olarak, karışık modlara izin veriliyorsa hangi değerlerin hangi argümanlarla eşleşeceğine yorumlayıcı karar vermesi imkansızdır. </q> Ruby, varsayılan değerlerden sonra varsayılan olmayan argümanlara izin verir. <q> İşlev çağrısında değişkenlerin atanmasını nasıl önereceksiniz? </q> Sadece kullanın func1(x=1, y=2).
zayıf

Merhaba @weakish, yorum için teşekkürler, Python bunu başarmak için güzel bir yolu var, lütfen * args ve ** kwargs için ara
Rahul Gautam

Merhaba @Rahul Gautam Kafam karıştı. **kwargsYapamayacağımı def fun1(a="who is you", b="True", x, y)veya benzer bir iş yapamayacağımı düşündüm . Eğer kullanırsanız def f(**kwargs), gövdedeki varsayılan değerleri ele almanız gerekir.
14'te

@weakish def fun1(a="who is you", b="True", x, y)aynı şey farklı bir stil ile elde edilebilir. def fun1 (** kwrgs) `sonra fun1({'a': 'who is you', 'b': True})x ve y'yi geçmeye gerek yoktur.
Rahul Gautam

2
Neden "Sözdizimsel olarak, karışık modlara izin veriliyorsa, hangi değerlerin hangi argümanlarla eşleşeceğine tercüman olarak karar vermek imkansızdır" diye yazıyorsunuz. PEP 3102'deki algoritmanın def foo(x=None, y)izin verilse bile tamamen aynı şekilde çalışabileceğini düşünüyorum . Bu yüzden neden Python tarafından buna izin verilmediğini merak ediyorum . Gerçek bir temel sebep var mı yoksa sadece "buna izin vermiyoruz çünkü izin vermiyoruz".
Jeroen Demeyer

15
SyntaxError: non-default argument follows default argument

Buna izin vermek olsaydı onların varsayılan değerleri kullanmak mümkün olmayacak çünkü varsayılan olmayan argümanlar gel beri, varsayılan argümanlar, işe yaramaz hale olurdu sonra .

Ancak Python 3'te aşağıdakileri yapabilirsiniz:

def fun1(a="who is you", b="True", *, x, y):
    pass

Bu, yalnızca bunu yapabilmeniz için yapar xve yanahtar kelime yapar :

fun1(x=2, y=2)

Bu işe yarıyor çünkü artık belirsizlik yok. Hala yapamayacağınızı unutmayın fun1(2, 2)(bu, varsayılan bağımsız değişkenleri ayarlar).


Yalnızca anahtar kelime bağımsız değişkenleri Python 3'ün düzgün bir özelliğidir. Python 2.6 ve 2.7'ye onları geri döndüren yama çok kötü sona erdi .
Nick Chammas

10

Burada iki noktayı açıklayayım:

  • öncelikle varsayılan olmayan bağımsız değişken varsayılan bağımsız değişkeni izlememelidir, işlevde (a = b, c) işlevindeki parametreyi tanımlama sırasını şu şekilde tanımlayamayacağınız anlamına gelir:
    • konumsal parametre veya varsayılan olmayan parametre yani (a, b, c)
    • anahtar kelime parametresi veya varsayılan parametre ie (a = "b", r = "j")
    • salt anahtar kelime parametresi ie (* args)
    • var-anahtar kelime parametresi ie (** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(a, b) konumsal parametredir

(c = yok) isteğe bağlı bir parametredir

(r = "w") anahtar kelime parametresidir

(d = []) liste parametresidir

(* ae) yalnızca anahtar kelimedir

(** ab) var-anahtar kelime parametresidir

  • şimdi ikincil şey böyle bir şey denerseniz: def example(a, b, c=a,d=b):

Varsayılan değerler kaydedildiğinde bağımsız değişken tanımlanmaz, işlevi tanımladığınızda Python varsayılan değerleri hesaplar ve kaydeder

c ve d tanımlanmadı, mevcut değil, bu olduğunda (yalnızca işlev yürütüldüğünde var olur)

"a, a = b" parametresinde izin verilmiyor.


0

Gerekli bağımsız değişkenler (varsayılan olmayanlar), istemci kodunun yalnızca ikisini sağlamasına izin vermek için başlangıçta olmalıdır. İsteğe bağlı argümanlar başlangıçta olsaydı, kafa karıştırıcı olurdu:

fun1("who is who", 3, "jack")

İlk örneğinizde bu ne olurdu? Son olarak, x "kim kimdir", y 3 ve a = "jack" dir.

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.