Как перебрать аргументы функции
У меня есть функция Python, принимающая несколько строковых аргументов def foo(a, b, c):
и объединение их в строку.
Я хочу перебрать все аргументы функции, чтобы проверить, что они не являются None. Как это можно сделать?
Есть ли быстрый способ конвертировать None в ""?
Спасибо.
Ответы
Ответ 1
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'
Ответ 2
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)
Ответ 3
Вы можете использовать модуль проверки и определить такую функцию:
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
Ответ 4
Возможно, это то, что вам нужно?
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(), которое возвращает dict.
Ответ 5
Я бы использовал sed s/None//g, но это не в python, но вы можете использовать os.popen() для этого.