2017-04-21 111 views
1

目前我正在嘗試將Python的「類功能」放入函數中。如何通過傳遞**參數來更新函數變量

示例代碼:

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

我可能會誤解這一點,但我認爲你將要遇到的問題是函數數據會傳遞「實例」,因爲函數只有一個副本,並且該函數的所有用途都將共享相同的對象。請參閱以下示例:

# 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}