【问题标题】:Pythonic syntax for extended variable transformation (multiple lengthy method calls)用于扩展变量转换的 Pythonic 语法(多个冗长的方法调用)
【发布时间】:2019-11-24 06:24:45
【问题描述】:

试图寻求有关策划广泛 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?

【问题讨论】:

    标签: python pandas petl


    【解决方案1】:

    创建一个部分应用函数的列表,然后遍历该列表。

    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)
    

    您的“总”转换是列表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)
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多