Establecer el valor predeterminado de una entrada de la función sea igual a otra entrada en Python
-
30-09-2019 - |
Pregunta
Tenga en cuenta la siguiente función, que no funciona en Python, pero voy a utilizar para explicar lo que tengo que hacer.
def exampleFunction(a, b, c = a):
...function body...
Eso es lo desee asignar a la variable c
el mismo valor que la variable a
llevaría, a menos que se especifique un valor alternativo. El código anterior no funciona en Python. ¿Hay una manera de hacer esto?
Gracias.
Solución
def example(a, b, c=None):
if c is None:
c = a
...
El valor por defecto para el argumento de palabra clave no puede ser una variable (si lo es, se convierte en un valor fijo cuando se define la función.) Comúnmente se usa para pasar argumentos a una función principal:
def main(argv=None):
if argv is None:
argv = sys.argv
Si None
podría ser un valor válido, la solución es o bien el uso *args
/ magia **kwargs
como en la respuesta de Carl, o utilizar un objeto centinela . Las bibliotecas que hacen esto incluyen attrs y Marshmallow , y en mi opinión, es mucho más limpio y probablemente más rápido.
missing = object()
def example(a, b, c=missing):
if c is missing:
c = a
...
El solamente camino para c is missing
es cierto es que c
sea exactamente que objeto ficticio que creó allí.
Otros consejos
Este patrón general es probablemente la mejor y más legible:
def exampleFunction(a, b, c = None):
if c is None:
c = a
...
Hay que tener cuidado de que None
no es un estado válido para c
.
Si desea que los valores al apoyo 'none', se puede hacer algo como esto:
def example(a, b, *args, **kwargs):
if 'c' in kwargs:
c = kwargs['c']
elif len(args) > 0:
c = args[0]
else:
c = a
Uno de los enfoques es algo como:
def foo(a, b, c=None):
c = a if c is None else c
# do something