首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取传递给函数的所有参数和值

获取传递给函数的所有参数和值
EN

Stack Overflow用户
提问于 2012-05-24 00:54:11
回答 7查看 118.9K关注 0票数 90

我有一个Python函数fetch_data,它访问一个远程API,获取一些数据,并将其封装在一个响应对象中返回。它看起来有点像下图:

代码语言:javascript
复制
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中。然而,我有selffoobarbaz需要担心-我可以只存储(fetch_data, foo, bar, baz, kwargs),但这是一个非常不受欢迎的重复量。

本质上,我试图弄清楚如何从函数内部获得完全填充的*args**kwargs,包括函数的命名参数。

EN

回答 7

Stack Overflow用户

发布于 2012-05-24 01:01:19

我不会这么做,但是您可以使用inspect.getargspec来内省您的方法所接受的参数:

代码语言:javascript
复制
>>> 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()结合使用,以重新构建参数:

代码语言:javascript
复制
>>> def foobar(foo, bar, baz):
...     return [locals()[arg] for arg in inspect.getargspec(foobar).args]
... 
>>> foobar(1, 2, 3)
[1, 2, 3]

然而,只有在做高级函数装饰器之类的时候,你才真正需要这样的魔法。我觉得这有点过头了。

票数 40
EN

Stack Overflow用户

发布于 2018-06-08 22:57:55

我不确定这是否正是您想要的,但是locals()提供了一个局部变量字典。

代码语言:javascript
复制
>>> def foo(bar, toto):
...     print(locals())
...
>>> foo(3,'sometext')
{'toto': 'sometext', 'bar': 3}
票数 24
EN

Stack Overflow用户

发布于 2012-05-24 00:59:36

我认为一种更有Pythonic风格的方法是将你的函数变成一个生成器,只要服务器不断返回数据,就可以获取和yield数据。

这应该会产生整洁的代码,并使您能够避开在迭代中保留参数的所有复杂性(Python将神奇地为您做到这一点:-)

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10724495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档