#python-3.x
#python-3.x
Вопрос:
У меня есть общая функция, для которой я хотел бы, чтобы имя менялось в зависимости от значения предопределенной переменной. Не уверен, что это возможно в Python:
n = 'abc'
def f{n}(x):
print(x)
f{n}(3)
В приведенном выше примере имя функции в конечном итоге станет «fabc»?
Комментарии:
1. Обратите внимание, что если вы просто хотите ссылаться на функцию по динамическому имени, лучшим решением будет использовать dict , например
funcs = {'abc': fun1}
, тогда вы могли бы вызвать функцию, соответствующую ‘abc’ какfuncs['abc']()
.
Ответ №1:
Это возможно с помощью шаблона генерации кода exec
. Это также возможно путем types.FunctionType
непосредственного создания экземпляра экземпляра. Но гораздо более простым решением было бы оставить общее имя, а затем ввести псевдоним (другую ссылку на тот же объект функции) для динамического имени в любое пространство имен, которое вы хотите.
>>> def generic_function(x):
... print(x ** 2)
...
>>> dynamic_name = "func_abc"
>>> globals()[dynamic_name] = generic_function
>>> func_abc(3)
9
Чтобы внедрить в какое-либо другое пространство имен модуля, которое было бы setattr
вызовом:
setattr(other_mod, dynamic_name, generic_function)
Вы также можете переписать атрибут функции __name__
, если захотите, но, вероятно, в этом нет особого смысла.
Ответ №2:
Вы могли бы сделать это с помощью чего-то вроде приведенного ниже:
def f(n):
exec(f"def f{n}(x): print(x)")
return eval(f"f{n}")
Комментарии:
1. Однако это не работает, когда f использует имена из внешних областей.
2. Да, вы правы, ваше решение, безусловно, является лучшим подходом. Просто подумал, что я бы поделился этим методом, а также доказательством концепции, поскольку он достигает того, о чем просил OP, с тем же синтаксисом