2017-04-21 21 views
1

現在、私は関数にPython 'クラスの機能'を取得しようとしています。** argsを渡すことによって関数変数を更新する方法

例コード:

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) 

リターン:

{} 
{'anglerange': 15} 
45 

これは、引数の更新を解決する正しい方法ではありませんが、それのための正しい方法は何ですか?あるクラスでは、self.update.__dict__と呼ぶことができます。どのように設定されていますか?

標準コピーを実行するには、関数で引数の初期化が必要です。不明確なロジックはPython 3.5に

+0

クラスの機能をクラスに追加する理由はなぜですか? – bereal

+0

__init__などでクラスを作成するのではなく、これを行うことができるかどうか不思議です。これらの関数もテストと実験が簡単です。 – srood

+0

ローカル変数の値を更新することはできません。クラスでさえ 'print(self.anglerange)'をしなければならないでしょう。単に 'print(anglerange)'はここと同じように動作します。 –

答えて

0

を使用して

...キーで辞書値を更新します。

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

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

引数は通常、関数の本体では変更されません、彼らはなど、サイクルに書き換えることができます。 。その他の例:

def image_gen(anglerange=45): 
print anglerange 

image_gen() 
45 
image_gen(15) 
15 

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

私はこれを誤解しているかもしれませんが、私はあなたの問題は、関数データが​​関数のコピーが1つしかなく、その関数のすべての使用が同じオブジェクトを共有します。例については、次を参照してください。

# 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} 
関連する問題