2010-05-26 3 views
22

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

Спасибо.

ответ

27

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' 

Update:

моменты «Пример 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' 
+0

FWIW, я думаю, что' * args' - это путь сюда ... что, если вы хотите объединить шестнадцать строк? Я просто хотел показать, что это возможно в Python, используя подпись функции :-) – Johnsyweb

+0

вместо местных жителей вы также можете использовать vars(). – extraneon

+0

@extraneon Спасибо за подсказку. 'locals()' похоже, ведет себя так же, как 'vars()' без аргументов в этом случае. – Johnsyweb

15
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)

+0

Что делать, если все аргументы явно объявлены? Как в def foo (a, b, c): – jackhab

+0

@Jack: переопределите вашу функцию. Это был бы самый простой вариант. Если у вас всего несколько аргументов, вы можете поместить их в кортеж. – SilentGhost

+1

Но это делает код менее читаемым – jackhab

-5

Я хотел бы использовать SED S/None // г, но это не в питоне, но вы, вероятно, можете использовать операционную систему. popen(), чтобы сделать это.

+1

Что делать, если SilentGhosts в Windows ... ..not v pythonic .... :-) –

+2

Я думаю, что 'None' означает объект python' None', а не буквальную строку '' None '' –

2

Вы можете использовать модуль проверки и определить такую ​​функцию, что:

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

0

Является ли это может быть, что вы хотите?

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.

Смежные вопросы