Python:将args转换为dict,就像PHP的紧凑一样?

时间:2010-06-23 20:38:22

标签: php python reflection syntax

我想要一个与PHP的compact函数完全相同的函数。

即,如果我传入一个变量名列表:

compact('var1','var2')

它让我回到了一个字典:

{'var1':var1, 'var2':var2}

8 个答案:

答案 0 :(得分:3)

调用者中使用的变量名称不易被调用的函数使用。可能可以使用inspect的高级用法,但最好重新考虑为什么要使用变量名称。

更新:现在我知道你真正需要的是什么(“我想将我的变量传递给我的模板”),答案很简单:使用locals():它返回一个映射所有局部变量名的字典他们的价值观。

更新2:这个怎么样?:

def only(d, *keys):
    """Return the subset of dict `d` whose keys are in `keys`."""
    return dict((k,v) for k,v in d.iteritems() if k in keys)

...

a = 17
b = 23
template_data = only(locals(), "a", "b")

答案 1 :(得分:1)

该函数没有看到它的实际参数的名称(如果有的话 - ),实际上也没有任何迹象表明那些实际的参数是恰好是单变量而不是常量,函数调用的表达式的结果,或其他任何形式的表达。

所以,你所要求的,正如你所指定的那样,根本不可行。

答案 2 :(得分:1)

(1)Python不是PHP。 (2)“传递给函数时丢失的变量名”为真。

请勿使用变量。

执行更简单的操作。使用dict功能。

>>> dict( var1=1, var2='a', var3=1+3j )
{'var1': 1, 'var3': (1+3j), 'var2': 'a'}

这似乎做你想要的。变量“names”完全是一次。 您实际上不需要创建其他本地临时变量。

答案 3 :(得分:1)

>>> import inspect
>>> def compact(*args):
...     d = {}
...     for a in args:
...         d[a] = inspect.stack()[1][0].f_locals[a]
...     return d
...
>>> def test():
...     x = 5
...     print compact('x')
...
>>> test()
{'x': 5}

答案 4 :(得分:1)

Getting method parameter names in python的帮助下,您可以使用decorator解决方案,以便将其应用于任何功能:

def compactor(func):
    import inspect
    def compactor_impl(*args, **kwargs):
        arg_names = inspect.getargspec(func)[0]
        return dict(zip(arg_names, args))
    return compactor_impl

@compactor
def package(var1, var2, var3):
    pass

@compactor
def package2(var1, var2, var3, supervar):
    pass

assert package(1, 2, 3) == {'var1': 1, 'var2': 2, 'var3': 3,}
assert package2(1, 2, 3, 'boh') == {'var1': 1, 'var2': 2, 'var3': 3, 'var3': 3, 'supervar': 'boh'}

我假设这些函数除了返回name-value对之外什么都不做。您可能希望添加一些检查(断言)以确保len(args) == len(arg_names)kwargs为空,因为一旦应用了装饰器,就不会检查它。

答案 5 :(得分:0)

如果您有一个名为 args 的列表,并且您希望将其放入名为 kwargs 的字典中,如示例所示:

for k,v in enumerate(args):
    kwargs["var%d"%(k+1)] = v

键实际上是args中项目的索引;这不是很有用吗?

答案 6 :(得分:0)

这很尴尬并且有限制,但其余的工作

def p(*args):
  p = {}
  for i in args:   
     exec 'p["%s"] = %s' % (i, i)
  return p

答案 7 :(得分:0)

只需在函数开头使用 locals()即可。

def foo(x,y): 
   print x,y

def jar(x,y):
   foo(**locals())

def varjar(x,y):
   print locals()
   args =  locals().copy()
   args['x'] += 1
   args['y'] += 2
   foo(**args)
  • foo(1,2)和jar(1,2)print 1 2
  • varjar(1,2)打印{' y':2,' x':1}和2 4