[英]Decorator with argument as class method inside another Python class
我有一个实现装饰器的python类(作为classmethod
,感谢这篇classmethod
decorator-inside-python-class ,如下所示:
import os
from functools import wraps
import pandas as pd
class global_tracking():
def __init__(self, globals=None):
self.globals = globals
def save_current_data_frame_to_track(self,current_data_frame,path_to,filename,logger=None):
current_data_frame.to_parquet(filename+'.parquet.gzip', compression='gzip')
os.system('gsutil cp '+filename+'.parquet.gzip'+' gs://'+path_to+filename+'.parquet.gzip')
return True
@classmethod
def save_input_to_track_from_globals(cls,globals):
def save_input_to_track(func):
@wraps(func)
def func_wrapper(*args, **kwargs):
for key, kwarg in kwargs.items():
if isinstance(kwarg, pd.core.frame.DataFrame):
self.save_current_data_frame_to_track(kwarg,globals['file_system_path'])
return func(*args, **kwargs)
return func_wrapper
return save_input_to_track
我想在另一个类中使用此装饰器,如下所示:Python不允许我使用装饰器:
globals={'file_system_path':''}
class global_data_getter():
def __init__(self,globals):
self.globals=globals
@global_tracking(globals).save_input_to_track_from_globals(globals) #Python wont recognise this!
def get_train_data(self,file_name):
data_to_train = pd.read_csv(file_name)
return data_to_train
快速澄清,我希望每当使用get_train_data
时,该函数将读取并返回数据帧,并将其保存在Google存储中,这就是为什么我使用装饰器。
我希望装饰器是我保存其他装饰器的类的成员(全局跟踪),这些装饰器都是用来跟踪方法的。
全局变量(我知道不好的名字:()只是一个字典,其中包含有关将csv存储在哪里的信息
为什么我不能使用这个装饰器?
提前致谢!
您的代码混合了类对象,实例对象和函数对象。 您在global_tracking
函数的定义中global_tracking
该错误(请参见我的第一条评论),并在尝试调用其返回值时global_tracking
该错误。 对global_tracking(globals)
的调用返回一个函数对象,而不是实例对象。 调用返回的函数对象没有成员save_input_to_track_from_globals
,因此无法调用它。
我试图改进您的代码,但是它太虚构且不必要地复杂。 只需坚持使用简单的装饰器功能即可。 您提供的链接显示了Python语法的一些理论可能性,而不是您在现实生活中实际使用的东西。
装饰器语法已被故意限制,以免于您维护诸如此类的有问题的代码。 如果坚持这种复杂性水平,则可以在类名称空间中分配适当的装饰器,以便可以使用简单的名称,这将为您提供可接受的语法。
我首先会对使用类方法的合理性感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.