扩展变量转换的Pythonic语法(多个冗长的方法调用)

2024-05-12 20:06:47 发布

您现在位置:Python中文网/ 问答频道 /正文

试图寻求一些关于管理广泛的ETL过程的最佳方法的指导。我的管道有一个相当光滑的提取部分,并以简洁的方式加载到指定的文件中;但我认为进行转换步骤的唯一方法是一系列变量赋值:

a = ['some','form','of','petl','data']
b = petl.addfield(a, 'NewStrField', str(a))
c = petl.addrownumbers(b)
d = petl.rename(c, 'row', 'ID')
.......

重新格式化以分配相同的变量名是有意义的,但无助于可读性:

a = ['some','form','of','petl','data']
a = petl.addfield(a, 'NewStrField', str(a))
a = petl.addrownumbers(a)
a = petl.rename(a, 'row', 'ID')
.......

我读过多个方法调用,比如:

a = ['some','form','of','data']

result = petl.addfield(a, 'NewStrField', str(a))
    .addrownumbers(a)
    .rename(a, 'row', 'ID')
.......

但这行不通,因为函数需要表作为传递的第一个参数

我是否缺少一些基本的东西?我不愿意相信,正确的商业方式涉及1000+LOC


Tags: of方法formiddata方式etlsome
1条回答
网友
1楼 · 发布于 2024-05-12 20:06:47

创建一个部分应用函数的列表,然后在该列表上循环

transforms = [
    lambda x: petl.addfield(x, 'NewStrField', str(x)),
    petl.addrownumbers,
    lambda x: petl.rename(x, 'row', 'ID')
]

a = ['some', 'form', 'of', 'petl', 'data']
for f in transforms:
    a = f(a)

您的“total”转换是列表transforms中转换的组合。您可以使用提供函数组合的库预先完成这些操作(代价是一些额外的函数调用),也可以自己滚动

def compose(*f):
    if not f:
        return lambda x: x  # Identity function, the identity for function composition
    return lambda x: f[0](compose(f[1:])(x))

# Note the reversed order of the functions compared to 
# the list above.
transform = compose(
    lambda x: petl.rename(x, 'row', 'ID'),
    petl.addrownumbers,
    lambda x: petl.addfield(x, 'NewStrField', str(x)),
)


a = ['some', 'form', 'of', 'petl', 'data']
result = transform(a)

相关问题 更多 >