Некоторым функциям нужны "постоянные" значения (т.е. не предназначенные для последующего переопределения), которые не подлежат параметризации. Хотя аргументы по умолчанию хранятся только один раз для каждой функции, некоторые просто не очень смысл быть поставлен как параметры (т.е. быть частью signature). Для (не очень полезного) примера:
def foo(bar):
my_map = {"rab": barType, "oof": fooType}
return my_map.get(bar,defaultType)()
Он потратил время CPU и пространство памяти, чтобы переопределить такую константу для каждого вызова. Некоторые другие способы хранения таких констант, как глобальные уровни уровня модуля, или сделать функцию вызываемым классом, но могут быть и другие способы, возможно?
Когда вы выполняете глобальный путь на уровне модуля, я префикс my (подразумевается как a) постоянная переменная с "_", чтобы показать, что это не для кого-либо. Тем не менее, я чувствую, что пространство имен модулей слегка "загрязнено", не говоря уже о стыд использования что-то как обескураженные как глобальные:
_my_map = {"rab": barType, "oof": fooType}
def foo(bar):
return _my_map.get(bar,defaultType)()
Или преобразовать его в класс. Я делаю __call__
a classmethod, чтобы избежать необходимости создания экземпляров:
class foo:
my_map = {"rab": barType, "oof": fooType}
@classmethod
def __call__(cls,bar):
return cls.my_map.get(bar,defaultType)()
Являются ли эти решения достаточно питонными?
Есть ли другие способы сделать это?
Действительно ли практика использования таких "констант"?
Примечание Эти объекты в моих примерах не обязательно являются фактическими константами, но используются (и могут быть мыслимы) как таковые по их назначению.