Por que esse trecho de código gera um SyntaxError?
>>> 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
Enquanto o seguinte trecho de código é executado sem erros visíveis:
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
def myfunction(position_arguments, *arguments, **keywords):
`....`Respostas:
Todos os parâmetros necessários devem ser colocados antes de qualquer argumento padrão. Simplesmente porque eles são obrigatórios, enquanto argumentos padrão não são. Sintaticamente, seria impossível para o intérprete decidir quais valores correspondem a quais argumentos se modos mistos fossem permitidos. A
SyntaxError
é gerado se os argumentos não forem fornecidos na ordem correta:Vamos dar uma olhada nos argumentos das palavras-chave, usando sua função.
Suponha que seja permitido declarar a função como acima. Em seguida, com as declarações acima, podemos fazer as seguintes chamadas de argumento de posição ou de palavra-chave (regulares):
Como você sugerirá a atribuição de variáveis na chamada de função, como os argumentos padrão serão usados junto com os argumentos das palavras-chave.
Referência O'Reilly - Core-Python
Onde, como esta função, utilize os argumentos padrão sintaticamente corretos para as chamadas de função acima. A chamada de argumentos de palavras-chave se mostra útil por poder fornecer argumentos posicionais fora de ordem, mas, juntamente com argumentos padrão, eles também podem ser usados para "pular" argumentos ausentes.
fonte
func1(x=1, y=2)
.**kwargs
que não pode fazerdef fun1(a="who is you", b="True", x, y)
ou trabalho semelhante. Se você usadef f(**kwargs)
, precisa lidar com valores padrão no corpo?def fun1(a="who is you", b="True", x, y)
a mesma coisa pode ser alcançada com um estilo diferente. se def fun1 (** kwrgs) `entãofun1({'a': 'who is you', 'b': True})
não precisa passar x e y.def foo(x=None, y)
que fosse permitido. Ainda estou curioso para saber por que isso não é permitido pelo Python. Existe uma verdadeira razão fundamental ou é apenas "não permitimos porque não permitimos".Se você permitir isso, os argumentos padrão serão inúteis, porque você nunca poderá usar seus valores padrão, uma vez que os argumentos não padrão vêm depois .
No Python 3, no entanto, você pode fazer o seguinte:
que cria apenas uma palavra
x
-y
chave para que você possa fazer isso:Isso funciona porque não há mais ambiguidade. Observe que você ainda não pode fazer
fun1(2, 2)
(isso definiria os argumentos padrão).fonte
Deixe-me esclarecer dois pontos aqui:
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a, b) são parâmetros posicionais
(c = nenhum) é parâmetro opcional
(r = "w") é o parâmetro da palavra-chave
(d = []) é o parâmetro da lista
(* ae) é apenas palavra-chave
(** ab) é o parâmetro var-keyword
def example(a, b, c=a,d=b):
argumento não é definido quando os valores padrão são salvos, o Python calcula e salva os valores padrão quando você define a função
c e d não estão definidos, não existem, quando isso acontece (existe apenas quando a função é executada)
"a, a = b" não é permitido no parâmetro
fonte
Os argumentos necessários (aqueles sem padrões) devem estar no início para permitir que o código do cliente forneça apenas dois. Se os argumentos opcionais estivessem no início, seria confuso:
O que isso faria no seu primeiro exemplo? No último, x é "quem é quem", y é 3 e a = "valete".
fonte