Параметризуйте имя функции в Python

#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, с тем же синтаксисом