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'
FWIW, я думаю, что' * args' - это путь сюда ... что, если вы хотите объединить шестнадцать строк? Я просто хотел показать, что это возможно в Python, используя подпись функции :-) – Johnsyweb
вместо местных жителей вы также можете использовать vars(). – extraneon
@extraneon Спасибо за подсказку. 'locals()' похоже, ведет себя так же, как 'vars()' без аргументов в этом случае. – Johnsyweb