我正在尝试在我的脚本中做一些脏事。
我有一个函数可以对名为model
的对象应用一些转换。 model
可以包含多个属性,其中包括alpha
和delta
。但是,该函数必须能够使用自己的可选参数覆盖这些属性。
我想我必须检查函数是否已收到这些参数,如果没有,则将该属性重新分配给平面名称。 (从model.alpha
到alpha
)。这里的主要问题是为任何给定的情况编写解决此问题的循环。
我设法做到这一点的唯一方法是使用locals()
dict,但我觉得很脏。有什么建议?这是我的代码,粗略。
def transform(model, alpha=None, theta=None):
for p in ('alpha', 'theta'): #the list is longer, actually
if not locals()[p] and hasattr(model, p):
locals()[p] = getattr(model, p)
_rotate(model, alpha)
_translate(model, delta)
最后,该函数的可选参数是否有内部列表?像__parameters__
这样的东西?这样,我就可以for p in __parameters__
等等。
谢谢!
答案 0 :(得分:1)
您可以使用**kwargs
语法,然后直接在kwargs
词典而不是本地词典上操作:
def transform(model, **kwargs):
for p in ('alpha', 'theta', ...):
if 'p' not in kwargs and hasattr(model, p):
kwargs[p] = getattr(model, p)
(您可能仍希望显式迭代期望名称列表,以过滤掉可能也存在于kwargs中的任何意外参数。)
答案 1 :(得分:0)
如果你声明你的功能:
def transform(model, **kwargs):
...
然后所有关键字参数将作为字典传递给kwargs
中的函数。