[英]How to turn arbitrary number of strings into function arguments in python
我正在从csv接收数据,并希望将其转换为python函数的参数。 例如,如果csv说
12, foo=20, bar=30
10, foo=17, bar=40, baz=12
我想用f(12, foo=20, bar=30)
和f(10, foo=17, bar=40, baz=12)
两次调用我的函数。 我无法真正修改功能(我实际上是在使用请求库,并将此CSV转换为一系列请求)。 从CSV中提取字符串很容易,但是将它们转换为适当的函数调用似乎并不容易。
现在,我基本上拥有的是:
with open('request.csv') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
response = requests.get(row[0], row[1], row[2], row[3])
但这不适用于应读取“ auth = X”或类似内容的参数,也不适用于可变数量的参数。
line1 = '12, foo=20, bar=30'
line2 = '10, foo=17, bar=40, baz=12'
for line in [line1, line2]:
args = line.split(',')
# key named arguments (ignore first, bc it is unnamed)
named_args = {k.strip(): v.strip() for k, v in (x.split('=') for x in args[1:])}
# call your method
method_to_call(args[0], **named_args)
编辑:我在开发环境上测试了代码,并进行了有针对性的更新。 现在它应该可以正常工作了。
def func(i, foo=0, bar=4):
print(i, foo, bar)
row = '12, foo=20, bar=30'
args, kargs = [], {}
for arg in row.split(','):
arg = arg.strip()
if '=' in arg:
key, value = arg.split('=')
kargs[key.strip()] = value.strip()
else:
args.append(arg)
func(*args, **kargs)
非常危险的解决方案:
def func(i, foo=0, bar=4):
print(i, foo, bar)
row = '12, foo=20, bar=30'
eval('func(%s)' % row)
# Dangerous use:
row = '12, foo=20); sys.exit(0'
eval('func(%s)' % row)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.