SORU
5 HAZİRAN 2013, ÇARŞAMBA


Neden bu geçersiz sözdizimi. Python:

Neden Python *args ile sondaki virgül kullanabilir mi? Diğer bir deyişle, bu çalışıyor

>>> f(1, 2, b=4,)

Ama bu değil

>>> f(*(1, 2), b=4,)
  File "<stdin>", line 1
    f(*(1, 2), b=4,)
                   ^
SyntaxError: invalid syntax

Bu Python 2 ve Python 3 de böyledir.

CEVAP
5 HAZİRAN 2013, ÇARŞAMBA


Hadi language specification bak:

call                 ::=  primary "(" [argument_list [","]
                          | expression genexpr_for] ")"
argument_list        ::=  positional_arguments ["," keyword_arguments]
                            ["," "*" expression] ["," keyword_arguments]
                            ["," "**" expression]
                          | keyword_arguments ["," "*" expression]
                            ["," "**" expression]
                          | "*" expression ["," "*" expression] ["," "**" expression]
                          | "**" expression
positional_arguments ::=  expression ("," expression)*
keyword_arguments    ::=  keyword_item ("," keyword_item)*
keyword_item         ::=  identifier "=" expression

Hadi aşağı önemsiyoruz parçaları elemek için:

call                 ::=  primary "(" [argument_list [","]] ")"
argument_list        ::=  positional_arguments ["," keyword_arguments]
                            ["," "*" expression] ["," keyword_arguments]
                            ["," "**" expression]
positional_arguments ::=  expression ("," expression)*
keyword_arguments    ::=  keyword_item ("," keyword_item)*
keyword_item         ::=  identifier "=" expression

Yani, bir işlev çağrısı için herhangi bir tartışmadan sonra, , ekstra hakkımız var gibi görünüyor. Bu cpython uygulamada bir hata gibi görünüyor.

f(1, *(2,3,4), ) Bu dilbilgisi göre çalışması gerekir, ama CPython değil. mesela şöyle bir şey:


, Eric daha önce bir cevap yukarıda CPython uygulanmasını içerir CPython grammar specification, dilbilgisi bağlı. Burada aşağıda:

arglist: (argument ',')* ( argument [',']
                         | '*' test (',' argument)* [',' '**' test] 
                         | '**' test
                         )

Bu dilbilgisi olduğunu unutmayınaynı değilbir dil belirtimi tarafından önerilen. Bu uygulama bir hata olacağını düşünüyorum.


CPython uygulanması ile Ek sorunlar olduğunu unutmayın. Bu da desteklenmeli: f(*(1,2,3), *(4,5,6))

Tuhaf bir şekilde olsa da, özellikleri f(*(1,2,3), *(4,5,6), *(7,8,9)) izin vermiyor

Bu daha bakıyorumBelirtimi bu kısmı biraz düzeltmeye ihtiyacı olduğunu düşünüyorum. Bu izin verilir: f(x=1, *(2,3)) ama bu değil: f(x=1, 2, 3).


Ve belki de asıl soruya yardımcı olmak, CPython, eğer *args **kwargs özelliği kullanmasanız bile sonunda bir virgül var. Bu saçma olduğunu kabul ediyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • schmittastic

    schmittastic

    9 EYLÜL 2009