【问题标题】:Can you determine from a function, args, and kwargs, how variables will be assigned?你能从函数、args 和 kwargs 中确定如何分配变量吗?
【发布时间】:2021-01-26 17:08:01
【问题描述】:

我有一些样板逻辑,我想包装几个具有相同可选关键字的函数。现在它看起来像下面的代码。但是,这只处理 opt_key 作为关键字传递的情况,而不是按位置传递的情况。解决此问题的一种方法是了解如何解决参数分配。

是否有一些元函数接受一个函数、args 和 kwargs,并返回一个字典,该字典提供从变量名到值的映射?所以对于下面,

meta_function(g,1,2,3) 将返回 {"x" : 1, "y" : 2, "opt_key" : 3} 并且

meta_function(g,1,2,opt_key=3) 也会返回 {"x" : 1, "y" : 2, "opt_key" : 3}

def g(x,y,opt_key = None):
  return something

def h(z,opt_key = None):
  return something else

def wrap(f,*args,**kwargs):
  if kwargs["opt_key"] is None:

    #Do some stuff to get default opt_key

    kwargs["opt_key"] = default_opt_key
    v = f(args,kwargs)

    #Do some stuff to dispose default opt_key

    return v
  else:
    return f(args,kwargs)

wrap(g,x,y,opt_key = None)
wrap(h,x,opt_key = None)

【问题讨论】:

  • PEP 318。您也可以在类似问题中查看my answer
  • 您可以解开 args 和 kargs:return f(*args, **kwargs),这样您就不必管理用户是使用位置参数还是关键字 one。
  • 我不明白你的问题。 “你能从函数、args 和 kwargs 中确定如何分配变量吗?” - 是的:args 按位置分配,kwargs 按名称分配。这是他们的定义
  • @juanpa.arrivillaga,他们?我以为我只回应一个人。无论如何,我不清楚您的评论的含义?我指出 PEP 描述了装饰器的语法。我知道理论上使用语法“糖”或链函数调用没有区别。
  • @JoshBrownKramer,我从来没有说过我发送的答案是完整的解决方案,它只是可以升级以满足您的要求的示例之一。

标签: python


【解决方案1】:

是的,您想使用 inspect.signature 并使用 Signature 对象,这将允许您使用 .bind *args 和 **kwargs:

In [1]: import inspect

In [2]: args = 'a', 'b', 'c'

In [3]: kwargs = {}

In [4]: def g(x,y,opt_key = None):
   ...:   return something
   ...:
   ...: def h(z,opt_key = None):
   ...:   return something_else
   ...:

In [5]: g_signature = inspect.signature(g)

In [6]: g_signature.bind(*args, **kwargs)
Out[6]: <BoundArguments (x='a', y='b', opt_key='c')>

注意,这个BoundArguments 对象充当映射:

In [7]: bound_arguments = g_signature.bind(*args, **kwargs)

In [8]: bound_arguments.arguments['opt_key']
Out[8]: 'c'

【讨论】:

  • 这被否决了,但我不明白为什么。这不正是我想要的吗?
  • @JoshBrownKramer 不知道。那好吧。我很高兴它有所帮助。
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多