如何迭代函数参数

时间:2010-05-26 11:48:44

标签: python arguments

我有一个Python函数接受几个字符串参数def foo(a, b, c):并将它们连接成一个字符串。 我想迭代所有函数参数来检查它们不是None。怎么做? 有没有快速的方法将无法转换为“”?

感谢。

5 个答案:

答案 0 :(得分:34)

如果您在函数中首先调用它,那么

locals()可能是您的朋友。

示例1

>>> def fun(a, b, c):
...     d = locals()
...     e = d
...     print e
...     print locals()
... 
>>> fun(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2, 'e': {...}, 'd': {...}}

示例2

>>> def nones(a, b, c, d):
...     arguments = locals()
...     print 'The following arguments are not None: ', ', '.join(k for k, v in arguments.items() if v is not None)
... 
>>> nones("Something", None, 'N', False)
The following arguments are not None:  a, c, d

<强>答案

>>> def foo(a, b, c):
...     return ''.join(v for v in locals().values() if v is not None)
... 
>>> foo('Cleese', 'Palin', None)
'CleesePalin'

<强>更新

'示例1'强调,如果参数的顺序很重要,我们可能会做一些额外的工作,因为dict(或locals())返回的vars()是无序的。上述功能也不能非常优雅地处理数字。所以这里有几个改进:

>>> def foo(a, b, c):
...     arguments = locals()
...     return ''.join(str(arguments[k]) for k in sorted(arguments.keys()) if arguments[k] is not None)
... 
>>> foo(None, 'Antioch', 3)
'Antioch3'

答案 1 :(得分:17)

def func(*args):
    ' '.join(i if i is not None else '' for i in args)

如果你加入一个空字符串,你可以''.join(i for i in args if i is not None)

答案 2 :(得分:2)

您可以使用inspect模块并定义类似的函数:

import inspect
def f(a,b,c):
    argspec=inspect.getargvalues(inspect.currentframe())
    return argspec
f(1,2,3)
ArgInfo(args=['a', 'b', 'c'], varargs=None, keywords=None, locals={'a': 1, 'c': 3, 'b': 2})

在argspec中,您可以通过参数传递执行任何操作所需的所有信息。

要连接字符串就足以使用收到的arg信息:

def f(a,b,c):
    argspec=inspect.getargvalues(inspect.currentframe())
    return ''.join(argspec.locals[arg] for arg in argspec.args)

供参考: http://docs.python.org/library/inspect.html#inspect.getargvalues

答案 3 :(得分:1)

这可能是你想要的吗?

def foo(a, b, c):
    "SilentGhost suggested the join"
    ' '.join(i if i is not None else '' for i in vars().values())

def bar(a,b,c): 
    "A very usefull method!"
    print vars()
    print vars().values()

注意使用vars(),它返回一个字典。

答案 4 :(得分:-5)

我会使用sed s / None // g,但这不是在python中,但你可以使用os.popen()来做到这一点。