2017-04-21 2 views
1

Derzeit versuche ich eine Python 'Klassenfunktionalität' in eine Funktion zu bekommen.Wie aktualisiert man Funktionsvariablen durch die Übergabe von ** args

Beispielcode:

def image_gen(**kwargs): 
    anglerange= 45 
    print(image_gen.__dict__) 
    image_gen.__dict__.update(kwargs) 
    print(image_gen.__dict__) 
    print(anglerange) 

args = dict(anglerange=15) 

image_gen(**args) 

kehrt:

{} 
{'anglerange': 15} 
45 

Dies ist nicht der richtige Weg, das Argument, die Aktualisierung zu lösen, aber was ist der richtige Weg für sie? In einer Klasse können Sie self.update.__dict__ aufrufen, wie ist das in einer Funktion konfiguriert?

Ich brauche die Argument-Initialisierung in der Funktion für eine Standard-Kopie zu laufen.

Python 3.5

+0

Warum möchten Sie einer Funktion eine Klassenfunktionalität hinzufügen, wenn Sie Klassen dafür haben? – bereal

+0

Nur neugierig, ob es möglich ist, dies zu tun, anstatt eine Klasse mit __init__ usw. zu erstellen. Auch diese Funktionen finde ich einfacher zu testen und zu experimentieren. – srood

+0

Sie können nicht erwarten, den Wert einer lokalen Variablen zu aktualisieren. Selbst Klassen müssten "print (self.angleange)", nur "print (angle range)" würde genau so funktionieren wie hier. –

Antwort

0

Unklare Logik ... Aktualisieren Sie den Wörterbuch-Wert von key:

def image_gen(**kwargs): 
print(kwargs) 
kwargs['anglerange'] = 45 
print(kwargs) 

image_gen(**{'anglerange': 15}) 
{'anglerange': 15} 
{'anglerange': 45} 

Argumente in der Regel nicht in dem Körper der Funktion ändern, können sie in Zyklen neu geschrieben werden, usw. . Weitere Beispiele:

def image_gen(anglerange=45): 
print anglerange 

image_gen() 
45 
image_gen(15) 
15 

und

def rewrite_example(a): 
i = 0 
i = 1 
while i < 3: 
    print("i =", i, a) 
    i += 1 

rewrite_example('text') 
i = 1 text 
i = 2 text 
1

Ich mag das missverstehen, aber ich denke, dass das Problem, das Sie haben werden, darin besteht, dass Funktionsdaten "Instanzen" enthalten, da es nur eine Kopie der Funktion gibt und alle Verwendungen dieser Funktion teilen Sie das gleiche Objekt. Ein Beispiel:

# helper function, not really relevant 
def print_non_builtins(func): 
    orig = dir(func) + ['inspect'] 
    func.inspect = lambda: {k: getattr(func, k) for k in dir(func) if k not in orig} 
    return func 

@print_non_builtins 
def function_with_data(**kwargs): 
    for k, v in kwargs.items(): 
     setattr(function_with_data, k, v) 


function_with_data(a=1, b=2) 
print(function_with_data.inspect()) 
# {'a': 1, 'b': 2} 

function_with_data(b=3) 
print(function_with_data.inspect()) 
# {'a': 1, 'b': 3} 
Verwandte Themen