我有一个Python函数fetch_data
,它访问一个远程API,获取一些数据,并将其封装在一个响应对象中返回。它看起来有点像下图:
def fetch_data(self, foo, bar, baz, **kwargs):
response = Response()
# Do various things, get some data
return response
现在,响应数据可能会说“我有更多数据,请用递增的page
参数调用我以获取更多数据”。因此,我实际上希望将“方法调用”(函数、参数)存储在response对象中,这样我就可以拥有一个Response.get_more()
,它查看存储的函数和参数,并使用(几乎)相同的参数再次调用函数,返回一个新的Response
现在,如果将fetch_data
定义为fetch_data(*args, **kwargs)
,我就可以将(fetch_data, args, kwargs)
存储在response
中。然而,我有self
,foo
,bar
和baz
需要担心-我可以只存储(fetch_data, foo, bar, baz, kwargs)
,但这是一个非常不受欢迎的重复量。
本质上,我试图弄清楚如何从函数内部获得完全填充的*args
和**kwargs
,包括函数的命名参数。
发布于 2012-05-24 01:01:19
我不会这么做,但是您可以使用inspect.getargspec
来内省您的方法所接受的参数:
>>> import inspect
>>> def foobar(foo, bar, baz):
... return inspect.getargspec(foobar)
...
>>> foobar(1, 2, 3)
ArgSpec(args=['foo', 'bar', 'baz'], varargs=None, keywords=None, defaults=None)
然后可以将其与locals()
结合使用,以重新构建参数:
>>> def foobar(foo, bar, baz):
... return [locals()[arg] for arg in inspect.getargspec(foobar).args]
...
>>> foobar(1, 2, 3)
[1, 2, 3]
然而,只有在做高级函数装饰器之类的时候,你才真正需要这样的魔法。我觉得这有点过头了。
发布于 2018-06-08 22:57:55
我不确定这是否正是您想要的,但是locals()
提供了一个局部变量字典。
>>> def foo(bar, toto):
... print(locals())
...
>>> foo(3,'sometext')
{'toto': 'sometext', 'bar': 3}
发布于 2012-05-24 00:59:36
我认为一种更有Pythonic风格的方法是将你的函数变成一个生成器,只要服务器不断返回数据,就可以获取和yield
数据。
这应该会产生整洁的代码,并使您能够避开在迭代中保留参数的所有复杂性(Python将神奇地为您做到这一点:-)
https://stackoverflow.com/questions/10724495
复制相似问题