2012-01-10 9 views
5

¿Cómo puedo acceder mediante programación a los valores de argumento predeterminados de un método en Python? Por ejemplo, en lo que sigueAcceso a los valores de argumento predeterminados en Python

def test(arg1='Foo'): 
    pass 

cómo puedo acceder a la cadena 'Foo'test dentro?

+1

¿Puede dar un ejemplo que demuestra por qué es posible que desee hacer eso? – Kevin

+0

¿Quiere decir NO simplemente escribiendo 'arg1'? –

+0

Si no proporciona 'arg1' al llamar a' test', entonces 'arg1' se configurará por defecto a' 'Foo'' – TyrantWave

Respuesta

14

son s reada en test.func_defaults

+0

+1: esto! funciona. –

2

Ricardo Cárdenes está en el camino correcto. En realidad, llegar a la función testdentro detest va a ser mucho más complicado. El módulo inspect le dará más, pero va a ser feo: Python code to get current function into a variable?

Como resultado, se puede hacer referencia a test dentro de la función:

def test(arg1='foo'): 
    print test.__defaults__[0] 

imprimirá foo. Pero refiriéndose a test sólo funcionará, siempre y cuando test está definido en realidad:

>>> test() 
foo 
>>> other = test 
>>> other() 
foo 
>>> del test 
>>> other() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in test 
NameError: global name 'test' is not defined 

lo tanto, si tiene la intención de pasar alrededor de esta función, es posible que realmente tiene que ir a la ruta inspect :(

+0

También estaba bajo esa impresión, resulta que 'prueba 'está en el alcance local de' prueba 'como se señala en el comentario de Ricardo sobre mi respuesta. –

+0

¡genial para saber! actualicé mi respuesta para reflejar eso! –

+1

Si hacemos 'def test2(): print locals(), '\ n \ n', globals()', vemos que 'test2' está en globales, y no hay nada en los locales. –

0

Este no es muy elegante (en absoluto), pero hace lo que quiere:.

def test(arg1='Foo'): 
    print(test.__defaults__) 

test(arg1='Bar') 

Funciona con Python 3.x demasiado

+2

¿Por qué 'globals()'? 'test' es local en su propio ámbito, no es necesario. –

+0

@ RicardoCárdenes, tienes razón. No lo sabía, gracias. Arreglando ahora. –

4

considerar:

def test(arg1='Foo'): 
    pass 

In [48]: test.func_defaults 
Out[48]: ('Foo',) 

.func_defaults le da los valores por defecto, como una secuencia, con el fin de que los argumentos aparecen en el código.

Al parecer, func_defaults puede haber sido eliminado en Python 3.

+4

Creo que 'func_defaults' solo funciona en Python 2.x. '__defaults__' parece funcionar en Python 2.7 y 3.2. –

+0

@RobWouters: es bueno saberlo, aunque nunca uso python 3. – Marcin

Cuestiones relacionadas