2017-08-03 76 views
1

刚它是否能够通过一个功能所需参数传输到可以在函数外Python的传递函数的参数为​​一个字符串

例如可以使用一个字符串或其它格式一个简单的问题def add(a,b): return a+b,缺少缩进,抱歉的格式。

是否有可能将这些参数转换为字符串或其他格式?该目标的结果是:

a=10 
b=10 

str="a,b" 

add(str) 

对于简单的数据类型,它可以通过这种方式来实现:

For simple data types it can be implemented in

但考虑到复杂的条件,如训练神经网络,Keras,它需要的配置信息,作为数据集,优化器...在各种数据类型中,这种方法不起作用。

这很奇怪,但在我的情况下,如果可以简化我的代码库设计库工具箱training deep neuron networks,如model.fit()函数。

希望我的描述有意义。

------------------------------ UPDATE --------------- ------------

对不起,令人困惑的描述。希望这种尝试能够说清楚。

我的问题是在Python API与Keras训练神经网络的环境中,这里是对真正的问题密切的版本:

比方说,我们有一个功能funcA(p1,p2=None,p3,p4=None,....)与一些可选参数。然后我们有另一个功能funcB(..., params)得使调用funcA和我想做的事:

def funcB(..., params):

funcA(params)

PARAMS作为由funcA()需要这些参数的容器:

p1=...

p2=...

pn=...

然后params=[p1....pn]并使用funcB作为funcB(..., params)。因此它内部的funcA可以通过容器params传递给funcB()的配置执行。

如果您有兴趣,真正的案例是一个培训脚本(让我们说,火车。PY)包括:

model.fit(data,label, batch_size, epochs, verbose...)

我想找到它的outside的最佳时期量的脚本:

for i in range(3):

run train.py #includes model.fit(params) while params can be delivered in some way. 

但难的是如何传输多个(可选或非可选)参数传递到一个容器,称为params在我的情况。

+0

因为它的立场,这将失败,因为它会告诉ÿ你添加期望两个参数,并且你只传递了一个参数。你可能想阅读[python任意参数列表](https://docs.python.org/2.7/tutorial/controlflow.html#arbitrary-argument-lists),这可能会让你更接近你想要的位置。 –

+0

如果我理解了你的问题,我并不完全确定,你能解释一下最多吗? –

+0

@DamianLattenero对不起,我已经更新了它。 –

回答

3

编辑的编辑问题:

要做到这一点,你可以给的参数列表,并要求*:

def funcA(p1,p3,p4=None, p5= None): 
    print(p1+p3) 
    if p4 != None: 
    print(p1+p3+p4) 

def funcB(p1,p2,p3, params): 
    print(p1,p2,p3) 
    funcA(*params) 


funcA(2,3) 
funcA(2,3,5) 
funcB("hi", "everythin", "OK", [2, 3]) 
funcB("hi", "everythin", "OK", [2, 3, 5]) 

对于老问题:

您可以使用eval查看此案例,请看看:

a=10 
b=10 

tup = "a,b" 

def add(string): 
    ... 

如果我深知,你们说是这样的:

add(*(eval(tup))) 

至极给出:

2

达米安Lattenero的答案是goog但如果你不想更改该功能的代码,这可以工作:

a=10 
b=10 

str="a,b" 

add(*(eval(str))) 

*将扩大evalstr,并为您提供预期结果。

+1

真的很好!这是一个加号:D –

+0

如果我了解OP的任务,只需将一个可完全解析的字符串映射到局部变量名称就可以完成这项工作,无需将“eval”这种重型火炮放入其中。 –

-1

如果你想你描述和** kwargs是绝对不适用于你的情况下做到这一点,我想你可以使用locals()和辅助函数/装饰:

def get_args(d, s): 
    arguments = s.split(",") 
    return {x: d[x] for x in arguments} 

a = 10 
b = "hello" 

def custom_function(**kwargs): 
    print(kwargs) 

custom_function(**get_args(locals(), "a,b")) 

将打印 {'a': 10, 'b': 'hello'}

而且,在这种情况下,功能可以例如

def custom_function(a, b): 
    print(a, b) 
+0

Downvoting没有评论为什么是不好的形式。 –

相关问题