Pergunta

Gostaria de saber se é possível determinar se um parâmetro de função com um valor padrão foi aprovada em Python. Por exemplo, como funciona a dict.pop?

>>> {}.pop('test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented

Como é que o método pop determinar que a primeira vez que um valor de retorno padrão não foi aprovada? Isto é algo que só pode ser feito em C?

Graças

Foi útil?

Solução

Eu acho que você quer dizer "argumento palavra-chave", quando você diz "parâmetro nomeado". dict.pop() não aceitar o argumento de palavras-chave, assim que esta parte da questão é discutível.

>>> {}.pop('test', d=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments

Dito isto, a maneira de detectar se um argumento foi fornecido é usar o *args ou **kwargs sintaxe. Por exemplo:

def foo(first, *rest):
    if len(rest) > 1:
        raise TypeError("foo() expected at most 2 arguments, got %d"
                        % (len(rest) + 1))
    print 'first =', first
    if rest:
        print 'second =', rest[0]

Com algum trabalho, e usando a sintaxe **kwargs também é possível emular completamente a convenção de chamada python, onde argumentos podem ser prestados por posição ou por nome e argumentos fornecidos várias vezes (por posição e nome) causa um erro .

Outras dicas

A convenção é muitas vezes a utilização arg=None e utilização

def foo(arg=None):
    if arg is None:
        arg = "default value"
        # other stuff
    # ...

para verificar se ele foi aprovado ou não. Permitindo que o usuário passar None, que seria interpretado como se o argumento era não passado.

Você pode fazê-lo como este:

def isdefarg(*args):
    if len(args) > 0:
        print len(args), "arguments"
    else:
        print "no arguments"

isdefarg()
isdefarg(None)
isdefarg(5, 7)

Consulte a documentação do Python em chamadas para mais informações.

def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

Se este for o significado exato da sua pergunta, acho que não há nenhuma maneira de distinguir entre a 2 que estava no valor padrão e um 2 que foi passado. I não encontrou como realizar tal distinção, mesmo na inspecionar módulo .

Não estou certo se eu entender completamente o que é que você quer; no entanto:

def fun(arg=Ellipsis):
    if arg is Ellipsis:
        print "No arg provided"
    else:
        print "arg provided:", repr(arg)

O que fazer o que quiser? Se não, então como já foi sugerido, você deve declarar a função com a sintaxe *args, **kwargs e check-in os kwargs dict para a existência parâmetro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top