Как я могу получить доступ к функции func_dict? Есть ли эквивалент self для функций?

Я могу легко получить доступ к функции func_dict, если напишу ее имя внутри:

def func(a):
    print('{} {}'.format(func.prefix, a))

func.prefix = 'something'
func(4)

Есть ли способ получить доступ к prefix без необходимости снова писать func, подобно self в методах класса?


person Martín Fixman    schedule 25.11.2015    source источник
comment
Вы уверены, что func не должен быть методом класса?   -  person chepner    schedule 25.11.2015
comment
Или, возможно, prefix должен быть аргументом со значением по умолчанию?   -  person chepner    schedule 25.11.2015
comment
Откровенно говоря, лучшее решение (которое не предполагает никакого мошенничества с такой чепухой, как добавление аргумента self по умолчанию в функцию) — создать вызываемый класс в соответствии с второй ответ на связанный вопрос. Вы даже можете делать дополнительные трюки, например присваивать значения на уровне определения класса, а затем говорить func = func(), что заменит определение класса одним экземпляром класса (у которого есть self, который может получить доступ к переменным класса).   -  person ShadowRanger    schedule 25.11.2015


Ответы (1)


Вы только что сделали это.

def func(a):
    print('{} {}'.format(func.prefix,a))

Если вы вызовете его сам по себе без установки prefix, вы получите AttributeError, так как префикс еще не определен

Определив func.prefix='something', теперь, когда вы вызываете func(4), вы получите something 4 в качестве вывода. И вы можете просто продолжать переопределять func.prefix, и это обновит Attribute в func.

Если в вашем вопросе нет чего-то большего, вы уже сделали это правильно.

person Chrispresso    schedule 25.11.2015
comment
Нет смысла отвечать, если больше нечего добавить. Я думаю, что более важный вопрос здесь заключается в том, как получить доступ к пространству имен без использования имени функции, чтобы при переименовании func() все внутренние ссылки работали без необходимости их изменения. - person MrAlexBailey; 25.11.2015
comment
Jkdc прав, это была моя точка зрения. - person Martín Fixman; 25.11.2015