首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将函数映射到所有参数值上,作为一个列表?但是函数定义中有显式的参数名。

如何将函数映射到所有参数值上,作为一个列表?但是函数定义中有显式的参数名。
EN

Stack Overflow用户
提问于 2018-05-14 03:00:13
回答 2查看 167关注 0票数 0

我希望在函数定义中使用显式参数名ff(a,b,c)来定义一个函数,但我也希望在所有参数上映射一个函数以获得一个列表:

代码语言:javascript
复制
ff(a,b,c):
    return list(map(myfunc,[a,b,c]))

但是,我不想在函数中显式地将参数名写为a,b,c。

代码语言:javascript
复制
ff(a,b,c):
    return list(map(myfunc,getArgValueList()))

getArgValueList()将按顺序检索参数值,并形成一个列表。怎么做?有像getArgValueList()这样的内置函数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-14 03:27:03

如果没有丑陋的黑客,你想要做的事情是不可能的。您可以选择*args并获取可以用作args的一系列参数值。

代码语言:javascript
复制
def ff(*args):
    return list(map(myfunc, args))

…或者您使用三个显式参数并使用它们的名称:

代码语言:javascript
复制
def ff(a, b, c):
    return list(map(myfunc, (a, b, c)))

…但不是两者兼而有之。

当然,如果您想要的话,您可以自己将这些值放在一个序列中:

代码语言:javascript
复制
def ff(a, b, c):
    args = a, b, c
    return list(map(myfunc, args))

…但我不知道这给你买了什么。

如果您真的想知道如何编写getArgValueList函数,我将解释如何编写它。但是,如果您想让代码更易读、更高效、更地道、更容易理解、更简洁,或者几乎任何其他东西,那么它将产生完全相反的效果。我能想象这样做的唯一原因是,如果您必须动态地生成函数或者什么的话--即使这样,我也想不出为什么您不能只使用*args。但是,如果你坚持:

代码语言:javascript
复制
def getArgValueList():
    frame = inspect.currentframe().f_back
    code = frame.f_code
    vars = code.co_varnames[:code.co_argcount]
    return [frame.f_locals[var] for var in vars]

如果您想知道它是如何工作的,那么大部分都在inspect模块文档中:

  • currentframe()获得当前帧-- getArgValueList的帧。
  • f_back获得父帧--调用getArgValueList的人的框架。
  • f_code获取从调用getArgValueList的函数体编译的代码对象。
  • co_varnames是该主体中所有局部变量的列表,从参数开始。
  • co_argcount是显式位置或关键字参数的计数。
  • f_locals是一个具有框架的locals()环境副本的dict。

当然,这只适用于不需要*args、关键字的args或**kwargs的函数,但是您也可以通过一些工作将其扩展到工作。(详细信息请参见co_kwonlyargcountco_flagsCO_VARARGSCO_VARKEYWORDS。)

而且,这只适用于CPython,而不是大多数其他解释器。它可能会在将来的版本中崩溃,因为它非常明显地依赖于解释器的实现细节。

票数 2
EN

Stack Overflow用户

发布于 2018-05-14 03:03:11

construction将将这些参数作为列表提供:

代码语言:javascript
复制
>>> def f(*args): return list(map(lambda x:x+1, args))
>>> f(1,2,3)
[2, 3, 4]

如果使用f的签名绑定,则必须使用inspect模块:

代码语言:javascript
复制
import inspect

def f(a, b,c):
    f_locals = locals()
    values = [f_locals[name] for name in inspect.signature(f).parameters]
    return list(map(lambda x:x+1, values))

inspect.signature(f).parameters按正确的顺序给出了参数列表。这些值在locals()中。

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

https://stackoverflow.com/questions/50322592

复制
相关文章

相似问题

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