Я уверен, что вы не можете делать то, что вы хотите делать, если вы импортировать как from hardcoded_values import *
,
То, что вы хотите сделать, это установить foo
к некоторой функции, а затем применить property
декоратора (или эквивалент), так что вы можете позвонить Foo, как foo
, а не foo()
. Вы не можете использовать свойство декоратора модули по причинам, подробно здесь: Why Is The property Decorator Only Defined For Classes?
Теперь, если вы были import hardcoded_values
, то я думаю, что есть способ сделать то, что вы хотите hardcoded_values.foo
. У меня довольно хорошее ощущение, что я собираюсь описать BAD IDEA, который никогда не должен использоваться, но я думаю, что это интересно.
BAD IDEA ????
Так что вы хотели заменить постоянную как os.EX_USAGE
, который на моей системе является 64
с некоторой функцией, а затем вызвать его как os.EX_USAGE
, а не os.EX_USAGE()
.Мы должны иметь возможность использовать декоратор property
, но для этого нам нужен тип, отличный от module
.
Так что можно сделать, чтобы создать новый тип на лету и сваливать в __dict__
модуля с функцией типа фабрики, который принимает модуль в качестве аргумента:
def module_class_factory(module):
ModuleClass = type('ModuleClass' + module.__name__,
(object,), module.__dict__)
return ModuleClass
Теперь я буду импортировать ОС:
>>> import os
>>> os.EX_USAGE
64
>>> os.getcwd()
'/Users/Eric'
Теперь я сделать класс OsClass
и связать имя os
к экземпляру этого класса:
>>> OsClass = module_class_factory(os)
>>> os = OsClass()
>>> os.EX_USAGE
64
>>> os.getcwd()
'/Users/Eric'
Все по-прежнему работает. Теперь определим функцию, чтобы заменить os.EX_USAGE
, отметив, что нужно будет принимать фиктивный self
аргумент:
>>> def foo(self):
... return 42
...
... и связать атрибут класса OsClass.EX_USAGE
функции:
>>> OsClass.EX_USAGE = foo
>>> os.EX_USAGE()
42
Он работает, когда вызванный объектом os
! Теперь примените декоратор свойств:
>>> OsClass.EX_USAGE = property(OsClass.EX_USAGE)
>>> os.EX_USAGE
42
Теперь константа, определенная в модуле, была прозрачно заменена вызовом функции.
Я не получил то, что было бы в модуле 'config'. Я бы рекомендовал поместить функции в файл 'harcoded_values.py', например' def foo(): return SomeWrapper (config.get_value ('foo')) '. Затем из другого модуля вы будете делать 'from harcoded_values import foo' (не рекомендуется импортировать все с *), а затем' my_var = foo() '. – tomasyany
См. Мой обновленный вопрос. Это всего лишь пример, поэтому не беспокойтесь о * -импортах и т. Д. – orange
Хорошо. Я бы сделал это, как я сказал в своем комментарии раньше. Вместо того, чтобы импортировать переменную в другой модуль (который я не уверен, что вы можете это сделать), я бы импортировал функцию, которая возвращает значение. – tomasyany