2015-02-16 14 views
8

Ho cercato su di esso e ho ottenuto il seguente, python obtain variable name of argument in a function ma non sto ottenendo la risposta richiesta e sto ricevendo in realtà un errore dicendo add() prende esattamente 0 argomenti quando ho usato kwargs. Così ripubblicato per ottenere una risposta se ce n'è.Ottenere il nome parametro

Ho il seguente codice,

def add (arg1, arg2): 
    z = arg1 + arg2 
    print arg1Name, arg2Name, z 

x = 10 
y = 5 
add(x,y) 

voglio uscita come

x y 15 
+6

Per ottenere il risultato esatto richiesto è semplicemente ** impossibile **. Al momento dell'inizio di "aggiungi", i nomi che desideri stampare non sono lì da recuperare. Rinuncia a questo e accetta alternative come quella che citi e fraintendi (richiedendo una chiamata 'add (x = x, y = y)' per davvero ** preservare ** quei nomi che brami tanto male - per qualsiasi motivo sbagliato :-) –

+2

Per aggiungere a ciò che dice Alex, inoltre, se la funzione è chiamata come 'add (3, 4)' o 'add (some_other_func(), a + b)', allora qual è il "nome parametro"? – Thanatos

+0

@AlexMartelli Pensa a come in caso di errore, un traceback è in grado di mostrare esattamente quale sorgente allinea lo stack ha attivato l'errore. Quindi no, non è impossibile. – tripleee

risposta

7

Si consiglia di utilizzare l'attributo func_code.co_varnames della funzione di nomi parametri di accesso:

def add(arg1, arg2): 
    z = arg1 + arg2 
    print ' '.join(add.func_code.co_varnames[:2]) + ' ' + str(z) 

add(10, 5) 

Uscita:

arg1 arg2 15 

Si può leggere di più su attributi interni qui: https://docs.python.org/2/library/inspect.html#types-and-members

+0

Non lo sapevo.Cool – vks

+0

Unico problema: quell'attributo contiene tutti i nomi delle variabili che sono definiti all'interno della funzione, ecco perché ho cancellato la variabile z. –

+0

Oppure puoi usare la slice func_code.co_varnames [: 2]. –

4

penso che il più vicino si può arrivare a ciò che si vuole è la seguente:

def add (**kwargs):  

    assert len(kwargs) == 2, "Not enough arguments"  

    keys = kwargs.keys() 
    z = kwargs[keys[0]] + kwargs[keys[1]] 
    print keys[0], keys[1], z 


x = 10 
y = 5 
add(x=x,y=y) 
add(w=11,t=11) 

risultati in:

y x 15 
t w 22 
+0

@vks Non penso che i risultati di add.func_code.co_varnames restituiscano l'output del nome 'x' e' y'. Fornirà solo i nomi degli argomenti delle funzioni, ad esempio 'arg1',' arg2', non 'x' e' y'. – Marcin

+0

Ho anche provato e non funziona per me. Quindi se metti 'add (x, y)' la funzione stampa 'x y 15' anche se gli argomenti sono chiamati' arg1' e 'arg2'? In tal caso, puoi fornire la versione di python che usi e os. Forse il suo specifico os/python. – Marcin

+0

Sì, vuole xey. il nome degli argomenti di input. Quindi è stato già spiegato che non si può fare. Usando dict è il closes si può probabilmente arrivare ad esso. – Marcin

2

Una soluzione di linea qui, **kwargs restituisce un comando, verificare che con;

def add(**kwargs): 
    print (kwargs) 

add(x=5,y=10) 

>>> 
{'y': 10, 'x': 5} 
>>> 

È un normale dettato. Puoi raggiungere ogni elemento con metodi di dettatura di base.

print (kwargs.keys()) 

>>> 
dict_keys(['y', 'x']) 
>>> 

Utilizzando kwargs è una tradizione in realtà, si può usare quello che volete, invece di esso. Ecco la soluzione, stampare le chiavi dict e la somma dei valori;

def add(**ChuckNorris): #instead of **kwargs 
    print (" ".join(ChuckNorris.keys()),sum(list(ChuckNorris.values()))) 

add(x=5,y=10) 

>>> 
x y 15 
>>> 
1

È possibile farlo utilizzando il modulo traceback.

def get_current_arg_names(): 
    import traceback, re 
    tb = traceback.extract_stack() 
    method = tb[-2][2] 
    func_call = tb[-3][3] 
    args = re.search('%s\s*\((.*?)\)' % method, func_call).group(1) 
    return [ x.strip() for x in args.split(',') ] 

def add(arg1, arg2): 
    z = arg1 + arg2 
    print get_current_arg_names(), z 
    return z 

x = 1 
y = 3 
print add(x, y) 

Tuttavia dovrebbe essere migliorata e evento, allora la regex, v'è un requisito che la chiamata di funzione non essere ripartita su più righe.

Meglio modificare il codice se possibile in quanto ciò è disordinato.

Problemi correlati