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