我有一个字典,每个值都是一个带有类getter函数的lambda函数。
class test:
def __init__(
self,
filename: str,
):
self.filename = filename
@property
def read_file(self):
return read_file(self.filename) # Return pandas dataframe
func_1 = test(filename_1)
func_2 = test(filename_2)
ret = {}
ret ["key_1"] = lambda: func_1.read_file
ret ["key_2"] = lambda: func_2.read_file
我想用";key_ 1";不使用((如果调用func.read_file
,我可以这样做(因为@property(其主要思想是创建字典而不实际调用";read_file"功能
当我用一个特定的键调用字典时,只有一个";read_file"呼叫发生。
df = ret ["key_2"]
但现在我必须使用括号
df = ret ["key_2"]()
您可以继承python的dict
,并使用自定义getter创建自己的dict。它会像:
class another_dict(dict):
def __getitem__(self, key):
_item = dict.__getitem__(self, key)
if hasattr(_item, '__call__'):
_item()
return _item
d = another_dict()
d['func1'] = lambda: print('lambda called')
d['func1']
我使用AMIR解决方案作为灵感,但我发现了使用functools.partial
比lambda
:更好的方法(针对我的问题:(
def read_file(filename):
return pd.read_csv(filename)
class MyClass:
def __init__(self):
self._dict = {}
def __setitem__(self, key, value):
self._dict[key] = value
def __getitem__(self, key):
return self._dict[key]()
my_class = MyClass()
my_class[key] = partial(read_file, file_name)
df = my_class[key] # This is the first time when read_file happened with a unique filename.