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

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

Спасибо.

28
задан jackhab 26 May 2010 в 11:53
поделиться

5 ответов

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'
36
ответ дан 28 November 2019 в 03:13
поделиться

Я бы использовал sed s/None//g, но этого нет в python, но вы, вероятно, можете использовать os.popen() для этого.

-5
ответ дан 28 November 2019 в 03:13
поделиться

Вы можете использовать модуль 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 ​​

2
ответ дан 28 November 2019 в 03:13
поделиться
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)

17
ответ дан 28 November 2019 в 03:13
поделиться

Возможно, это то, что вы хотели бы?

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(), который возвращает дикту.

1
ответ дан 28 November 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: