我有一个函数g()
,以dict作为参数,例如:
>> g({'a':'foo', 'b':'bar', 'c','baz'})
a = foo
b = bar
c = baz
我想转换' g()
或从f()
创建一个新函数g()
,这样它就会采用位置参数而不是字典,例如:
>> f(a='foo', b='bar', c='baz')
a = foo
b = bar
c = baz
背景:
或者有人能想出更好的解决方法吗?
谢谢!
答案 0 :(得分:1)
本质上,你想要的是一个函数装饰器,它在调用你的函数之前执行某种预处理逻辑。首先,创建你的装饰。它将接收关键字参数并将其传递给内部函数。
In [239]: def baz(fnc):
...: def inner(**kwargs):
...: fnc(kwargs)
...: return inner
...:
使用@...
:
In [240]: @baz
...: def foo(dict_):
...: for k in dict_:
...: print(k, '=', dict_[k])
...:
调用原始函数:
In [241]: foo(a=1, b=2, c=3)
a = 1
b = 2
c = 3
答案 1 :(得分:0)
我会使用exec
方法,因为它允许您在代码中执行任何操作,因此没有太多需要学习的内容。例如,如果在代码中插入以下代码,则可以创建一个简单的函数,该函数对字典中的每个索引都有一个参数,而参数标识符都是字母表中的小写字母(所以这只适用于超过26个论点
def MakeFunction(DictionaryToUse):
arguments = ""#Defaults to no arguments
for i in range(97,97+len(DictionaryToUse)):#Adds another argument per dictionary item
arguments += chr(i) + ","
if len(arguments) > 0:
arguments = arguments[:-1]#Removes the last comma, if there is one
exec("def f(" + arguments + """):
print("hi")""",globals())#Defines a new function f so it can be called as a global function.
例如,要创建一个包含3个参数的函数,您可以使用:
MakeFunction({"foo":0,"bar":10,"foobar":96})
然后可以使用3个参数调用名为f
的新函数。
f(1,2,3)
你必须明确地定制它以满足你的需要,用你想要的功能名称替换f,并添加你想要的功能而不是print("hi")
。
答案 2 :(得分:0)
这是一个简单的函数g
将dict作为我想要'转换'的参数:
>>> def g(my_dict):
print('a:', str(my_dict['a']))
print('b:', str(my_dict['b']))
可以从f
轻松创建一个带有关键字参数的新函数g
:
>>> def f(**kwargs):
return g(kwargs)
让我们使用关键字args尝试f
:
>>> f(a='foo', b='bar')
a: foo
b: bar
f
不适用于位置参数:
>>> f('foo', 'bar')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-619-505f263ccdf6> in <module>()
----> 1 f(1, 2)
TypeError: f() takes 0 positional arguments but 2 were given
f
采用位置参数。在做了额外的研究后,我发现我的意思是关键字参数。我在问题中使用了错误的术语,道歉。f
,但不知怎的,其余的代码看到它返回的值{{1 }}。如果您有解释,请随时发表评论。