我有一个Python函数接受几个字符串参数def foo(a, b, c):
并将它们连接成一个字符串。
我想迭代所有函数参数来检查它们不是None。怎么做?
有没有快速的方法将无法转换为“”?
感谢。
答案 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()来做到这一点。