2017-04-21 114 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}