Tengo una clase FileSet con un método _process_series , que contiene un montón de bloques if - elif que hacen formato específico de etiqueta de pandas.Series filetag
elif filetag == "EntityA": ps[filetag+"_Id"] = str(ps[filetag+"_Id"]).strip() ps[filetag+"_DateOfBirth"] = str(pd.to_datetime(ps[filetag+"_DateOfBirth"]).strftime('%Y-%m-%d')).strip() ps[filetag+"_FirstName"] = str(ps[filetag+"_FirstName"]).strip().capitalize() ps[filetag+"_LastName"] = str(ps[filetag+"_LastName"]).strip().capitalize() ps[filetag+"_Age"] = relativedelta(datetime.today(), datetime.strptime(ps[filetag+"_DateOfBirth"], "%Y-%m-%d")).years return ps Me gustaría definir un método de format abstracto en la clase y mantener estos bloques de formato en módulos separados que se importan cuando se llama a _process_series para una etiqueta de filetag determinada. Perdone el pseudocódigo, pero algo como:
for tag in filetag: from my_formatters import tag+'_formatter' as fmt ps = self.format(pandas_series, fmt) return psY el módulo contendría el bloque de formato:
# my_formatters.EntityA_formatter ps[filetag+"_Id"] = str(ps[filetag+"_Id"]).strip() ps[filetag+"_DateOfBirth"] = str(pd.to_datetime(ps[filetag+"_DateOfBirth"]).strftime('%Y-%m-%d')).strip() ps[filetag+"_FirstName"] = str(ps[filetag+"_FirstName"]).strip().capitalize() ps[filetag+"_LastName"] = str(ps[filetag+"_LastName"]).strip().capitalize() ps[filetag+"_Age"] = relativedelta(datetime.today(), datetime.strptime(ps[filetag+"_DateOfBirth"], "%Y-%m-%d")).years return psPuede crear una función en su propio archivo .py e importarla. Si crea la misma función en cada archivo, puede llamarla.
aquí está f1.py:
def gimme(): return 'format 1'aquí está f2.py:
def gimme(): return 'format 2'Entonces tu archivo principal:
module_names = ['f1','f2'] for module_name in module_names: import_test = __import__(module_name) result = import_test.gimme() result = import_test.gimme() print(result)Lo que da la salida:
format 1 format 2¿Por qué no usar globals con asterisco?
from my_formatters import * for tag in filetag: fmt = globals()[tag + '_formatter'] ps = self.format(pandas_series, fmt) return psConvertí tu pseudocódigo a código real.
documentación globals :
Devuelve un diccionario que representa la tabla de símbolos global actual. Este es siempre el diccionario del módulo actual (dentro de una función o método, este es el módulo donde se define, no el módulo desde el que se llama).
Su pseudocódigo podría convertirse en código real así:
import my_formatters for tag in filetag: fmt = getattr(my_formatters, tag + '_formatter') ps = self.format(pandas_series, fmt) return ps