Python: Kann ich das Funktionsverhalten ändern, ob die Ausgabe zugewiesen ist oder nicht?

In Matlab ist nargout eine Variable, die dir sagt, ob die Ausgabe zugewiesen ist

x = f(2); 

und

 f(2); 

Kann sich anders verhalten

Ist es möglich, in Python ähnlich zu machen?

Ich habe eine Funktion, die zum Aufnehmen und Zurückgeben eines matplotlib Figur Objekts. Ich möchte, dass, wenn Ausgabe einer Variablen zugewiesen wird, dann nicht auf den Bildschirm zu zeichnen.

2 Solutions collect form web for “Python: Kann ich das Funktionsverhalten ändern, ob die Ausgabe zugewiesen ist oder nicht?”

Hier ist eine Art, wie du es tun kannst (nicht, dass ich es raten würde), aber es hat viele Fälle, wo es nicht funktionieren wird – um es funktionieren zu lassen, musst du im Grunde den Python-Code in der Zeile analysieren und sehen, was es ist Tut es, was bis auf ein gewisses Niveau möglich wäre, aber es gibt wahrscheinlich immer schon Wege, um es zu umgehen.

 import inspect, re def func(x, noCheck=False): if not noCheck: #Get the line the function was called on. _, _, _, _, lines, _ = inspect.getouterframes(inspect.currentframe())[1] #Now we need to search through `line` to see how the function is called. line = lines[0].split("#")[0] #Get rid of any comments at the end of the line. match = re.search(r"[a-zA-Z0-9]+ *= *func\(.*\)", line) #Search for instances of `func` being called after an equals sign try: variable, functioncall = match.group(0).split("=") print variable, "=", functioncall, "=", eval(functioncall.strip()[:-1] + ", noCheck=True)") except: pass #print "not assigned to a variable" #Actually make the function do something return 3*x**2 + 2*x + 1 func(1) # x = func(1) x = func(1) 

Eine andere Möglichkeit, es zu tun, wäre es, alle voreingestellten lokalen Variablen zu untersuchen, wenn du den Code nennst und überprüfe, ob einer von ihnen auf das Ergebnis deiner Funktion eingestellt worden ist, dann benutze diese Information, um zu helfen, die Python zu analysieren.

Oder du könntest auf Objekt-IDs schauen und es versuchen, Dinge so zu machen, aber das ist nicht gut, um einfach zu sein, da nicht alle Objekte auf die gleiche Weise funktionieren (dh a=10 und c=10 und dann einen Blick auf jedes Objekt haben IDs, sie sind die gleichen ven obwohl a und c sind getrennt. Das gleiche passiert mit kurzen Strings auch)

Wenn du einen Weg nach oben machen kannst, um das zu tun, was universell funktionieren würde, wäre ich interessiert zu wissen, wie du es machst, ich würde drückend sein, es muss getan werden, indem du in Inspektion umhergehst, anstatt durch das Parsen der tatsächlichen Code.

Andere haben erwähnt, dass dies komplex ist, aber kann mit Inspektion getan werden. Sie können einen einfachen Ansatz, indem Sie eine separate Funktion, um es zu plotten, oder übergeben Sie eine zusätzliche Variable, die zu plotten sagt.

 def create_plot(x): return plot def display(plot): # show the plot x = create_plot(2) display(x) 

Plotvariable

 def plot(x, show=False) # create the plot if show: # show the plot plot(2, True) x = plot(2) 

Es ist wahrscheinlich nicht die Zeit wert und einfacher, nur die beiden Funktionen zu erstellen.

Persönlich denke ich, das ist hässlich, böse, und ich glaube nicht, dass die Funktionalität auf etwas basieren sollte, das den Rückgabewert fängt. Allerdings war ich neugierig, und ich fand einen Weg. Sie könnten das wahrscheinlich in einen Dekorateur verwandeln, wenn Sie es in der Zukunft nutzen wollen, aber ich schlage immer noch vor, dass Sie zwei separate Methoden verwenden, anstatt auf eine Ausgabe zu überprüfen.

 import inspect def f(val): has_output = False frame = inspect.currentframe() name = frame.f_code.co_name outer = inspect.getouterframes(frame)[1] # may want to loop through available frames. for i in range(len(outer)): item = str(outer[i]).replace(" ", "") check = "="+name+"(" if check in item and "="+check not in item: # also check assignment vs equality # Your method has an output has_output = True break if has_output: print("Something catches the output") return val*val # end f 

In vielen Fällen wird das auch nicht funktionieren. Du musst wirklich gut regex für den Scheck machen, wenn du es immer willst.

 import my_lib x = my_lib.f(2) 
Python ist die beste Programmiersprache der Welt.