Python using function like variable -
i've got python module has several variables hard-coded values used throughout project. i'd bind variables somehow function redirect config file. possible?
# hardcoded_values.py foo = 'abc' bar = 1234 # usage somewhere else in module hardcoded_values import * print foo print bar what want change hardcoded_values.py, print foo transparently calls function.
# hardcoded_values.py import config foo = somewrapper(config.get_value, 'foo') # or whatever can think of call config.get_value('foo') ... config.get_value function called parameter 'foo' when using variable foo (as in print foo).
i'm pretty sure can't want if import from hardcoded_values import *.
what want set foo function, , apply property decorator (or equivalent) can call foo foo rather foo(). cannot apply property decorator modules reasons detailed here: why property decorator defined classes?
now, if import hardcoded_values think there way want hardcoded_values.foo. have pretty feeling describe bad idea should never used, think interesting.
bad idea???
so wanted replace constant os.ex_usage on system 64 function, , call os.ex_usage rather os.ex_usage(). need able use property decorator, need type other module.
so can done create new type on fly , dump in __dict__ of module type factory function takes module argument:
def module_class_factory(module): moduleclass = type('moduleclass' + module.__name__, (object,), module.__dict__) return moduleclass now import os:
>>> import os >>> os.ex_usage 64 >>> os.getcwd() '/users/eric' now make class osclass, , bind name os instance of class:
>>> osclass = module_class_factory(os) >>> os = osclass() >>> os.ex_usage 64 >>> os.getcwd() '/users/eric' everything still seems work. define function replace os.ex_usage, noting need take dummy self argument:
>>> def foo(self): ... return 42 ... ...and bind class attribute osclass.ex_usage function:
>>> osclass.ex_usage = foo >>> os.ex_usage() 42 it works when called os object! apply property decorator:
>>> osclass.ex_usage = property(osclass.ex_usage) >>> os.ex_usage 42 now constant defined in module has been transparently replaced function call.
Comments
Post a Comment