2016-07-17 8 views
2

Betrachten wir zugreifen wir eine Funktion und eine innere Funktion wie diese haben (, die wir nicht ändern können):Wie eine freie Variable einer Funktion von außen

from functools import wraps 
def outer_f(some_callable): 
    def inner_f(v): 
     return some_callable(v) + 1 
    return inner_f 

Und wir erhalten nur eine Funktion ' Func‘, die die genannte Version von outer_f ist, die so inner_f entspricht:

>>> func = outer_f(int) 

In einem solchen Fall wird die Variable mit dem Namen‚some_callable‘ist der Typ int und wenn wir func mit einem Parameter aufrufen bekommen wir eine Antwort so:

>>> func('1') 
2 

würde Ich mag some_callable von außerhalb der Funktion zuzugreifen, wenn ich nur func Funktionsinstanz (was nachouter_f genannt bedeutet).

Wenn ich mich nicht irre, ist some_callable eine freie Variable der Funktion inner_f (func.func_code.co_freevars). Wie kann ich wissen, dass func mit dem Parameter int nur mit func aufgerufen wird?

Ich konnte das Problem nicht lösen, indem ich das Modul inspect oder die Attribute der Funktion betrachte. Methoden wie Aufruf func mit Trace-Modul dann Inspektion des Stack-Trace oder mit pdb scheint vielversprechend, aber sie wäre irgendwie hässlich Hacks.

Diese Frage reduziert sich einfach, um von außen auf eine freie Variable des Funktionsumfangs zuzugreifen.

Also wie kann ich wissen, dass die freie Variable 'some_callable' 'int' ist, ohne die Funktion auszuführen?

+0

Was Python-Version haben Sie zur Verfügung? –

+1

Was ist das eigentliche Problem, das Sie damit lösen wollen? Warum brauchst du Zugang zu 'func'? – jonrsharpe

Antwort

2

können Sie tun:

import inspect 
result = inspect.getclosurevars(func).nonlocals['some_callable'] 

Beispiel:

>>> from functools import wraps 
>>> 
>>> def outer_f(some_callable): 
...  def inner_f(v): 
...   return some_callable(v) + 1 
...  return inner_f 
... 
>>> 
>>> func = outer_f(int) 
>>> 
>>> import inspect 
>>> result = inspect.getclosurevars(func).nonlocals['some_callable'] 
>>> 
>>> result 
<class 'int'> 
+1

GetClosuresvars ist nicht in Python 2.7 implementiert, aber dank Ihrer Antwort konnte ich eine Lösung für 2.7 direkt finden: http://StackOverflow.com/Questions/19416876/Reflect-Inspect-Closed-Over-Variables-in- Python Entschuldigung, dass ich meine Python-Version nicht angegeben habe. – functure

Verwandte Themen