2017-06-18 8 views
1

Ich möchte eine Variable erstellen, die bei jeder Abfrage einen anderen Wert zurückgibt. DieseWie erstellt man eine dynamische Variable?

ist das, was ich bisher:

import datetime 

def getVal(): 
    return datetime.datetime.now().time() 

TMP_VAR = lambda: getVal() 

for a in range(0,10): 
    print TMP_VAR() 

Dies funktioniert und ich:

13:06:41.799504 
13:06:41.800129 
13:06:41.800139 
13:06:41.800145 
13:06:41.800161 
13:06:41.800167 
13:06:41.800173 
13:06:41.800179 
13:06:41.800184 
13:06:41.800190 

Wie auch immer, TMP_VAR ist jetzt eine Funktion. Gibt es eine Möglichkeit, dies auf die folgende Weise funktionieren zu lassen?

print TMP_VAR 

Effektiv, mit einer aufrufbaren Funktion verknüpft mit einer Variablen. Jedes Mal, wenn ich meine TMP_VAR in eine andere Funktion übergebe, wertet sie als Argument immer neu aus und hält zufällig einen neuen Wert (was auch immer die getVal() Funktion in diesem Moment zurückgibt).

+0

Es scheint, als gäbe es keine einfache Lösung für das Problem. Die Verwendung von 'TMP_VAR()' anstelle von 'TMP_VAR' scheint eine bessere Lösung zu sein, als einen' Klassen'-basierten Ansatz implementieren zu müssen. – symbolix

Antwort

1

, wenn Sie nicht mit nichts dagegen A zuerst eine Instanz TMP einer Klasse zu erstellen, können Sie dieses Verhalten haben mit einem property:

from datetime import datetime 

class A: 
    @property 
    def VAR(self): 
     return datetime.now().time() 

TMP = A() 
print(TMP.VAR) 
+1

Danke. Aber ich möchte die "Klassen" -basierte Lösung vorerst vermeiden. Ich weiß, dass dies gelöst werden könnte, indem man eine '__call __()' Methode für die Variable vortäuscht, aber nicht ganz sicher, wie man das macht. – symbolix

2

Ich glaube nicht, das ist eine gute Idee und empfehlen Ihnen um es eine Funktion zu lassen, da es offensichtlicher und lesbarer ist.

Aber wenn Sie das wirklich brauchen - es ist die Abhilfe Klassen wie

import datetime 


class Timer(object): 
    def __call__(self): 
     return datetime.datetime.now().time() 

    def __str__(self): 
     return str(self()) 


TMP_VAR = Timer() 

jetzt verwenden, können wir

for a in range(0, 10): 
    print TMP_VAR 

oder

for a in range(0, 10): 
    print TMP_VAR() 

und bekommen die gleiche Ausgabe schreiben.

+0

Das funktioniert gut mit Drucken, aber was ist, wenn Sie die Zeit tatsächlich als Zeitobjekt verwenden möchten? –

+0

@tobias_k: Wenn wir Funktion aufrufen wollen, ohne sie aufzurufen - wir können Eigenschaft und Zugriff auf jede Iteration machen, denke ich, es gibt keinen anderen Weg –

2
import datetime 

class dynamic_var(): 

    def __init__(self): 
     pass   

    def getVal(self): 
     return datetime.datetime.now().time() 

    def __repr__(self): 
     return str(self.getVal()) 

    def __str__(self): 
     return str(self.getVal()) 


def main(): 
    tmp_var = dynamic_var() 

    for a in range(0, 50): 
     print(tmp_var) 

if __name__ == "__main__": 
    main() 
+0

Ich mag die Idee! der einzige Nachteil ist, dass Sie nur die Zeichenfolgen auf diese Weise zurückgeben können ... (nicht sicher, ob das für das OP ausreicht). –

+0

Gibt es eine Möglichkeit, dies durch die '__call__' Methode zu tun? Also sind wir nicht auf die Ansätze "__str__" und "__repr__" beschränkt? – symbolix

Verwandte Themen