Pregunta

Me gustaría saber si es posible determinar si se pasó un parámetro de función con un valor predeterminado en Python. Por ejemplo, ¿cómo funciona 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

¿Cómo determina el método pop que la primera vez que no se pasó un valor de retorno predeterminado? ¿Es esto algo que solo se puede hacer en C?

Gracias

¿Fue útil?

Solución

Supongo que te refieres a " argumento de palabra clave " ;, cuando dices " parámetro denominado " ;. dict.pop () no acepta argumentos de palabras clave, por lo que esta parte de la pregunta es discutible.

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

Dicho esto, la forma de detectar si se proporcionó un argumento es usar la sintaxis * args o ** kwargs . Por ejemplo:

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]

Con algo de trabajo, y usando la sintaxis ** kwargs también es posible emular completamente la convención de llamadas a python, donde los argumentos pueden proporcionarse por posición o por nombre, y los argumentos se proporcionan varias veces. (por posición y nombre) causa un error.

Otros consejos

La convención suele ser usar arg = None y usar

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

para comprobar si fue aprobado o no. Permitir que el usuario pase None , lo que se interpretaría como si el argumento no se hubiera aprobado.

Puedes hacerlo así:

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

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

Consulte la documentación de Python en llamadas para obtener información completa.

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

f(1, 2)

Si este es el significado exacto de su pregunta, creo que no hay manera de distinguir entre un 2 que estaba en el valor predeterminado y un 2 que se ha pasado. No encontré cómo lograr tal distinción, incluso en la inspeccionar módulo.

No estoy seguro si entiendo completamente qué es lo que quieres; sin embargo:

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

¿Eso hace lo que quieres? Si no, como lo han sugerido otros, debe declarar su función con la sintaxis * args, ** kwargs y verificar el dictado de kwargs para la existencia del parámetro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top