Подтвердить что ты не робот

Как перебрать аргументы функции

У меня есть функция Python, принимающая несколько строковых аргументов def foo(a, b, c): и объединение их в строку. Я хочу перебрать все аргументы функции, чтобы проверить, что они не являются None. Как это можно сделать? Есть ли быстрый способ конвертировать None в ""?

Спасибо.

4b9b3361

Ответ 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() для этого.