Python 中具有管道或方法链接的流畅接口

问题描述 投票:0回答:1

我从 F# 和 Elixir 转向 Python,在干净地编码数据转换方面遇到了很大的困难。我曾经使用过的每种语言都有管道运算符和/或方法链接的概念,因此对于 Python,我很困惑如何找到一种easy的方法来完成此任务,并且不会偏离所谓的“Pythonic” “代码。

这是我可能拥有的一些处理功能的简单集合:

def convert_int_to_bool(integer: int) -> bool:
    match integer:
        case 0:
            False
        case 1:
            True
        case _:
            ValueError(
                f"Integer value must be either 0 or 1 to be converted to `bool`. Given: {integer}"
            )

def convert_string_to_characters(string: str) -> list[str]:
    return [character for character in string]

在Python中,我可以做类似的事情:

def test(response: str) -> <some type>:
    [a, b, c, d] = map(convert_int_to_bool, map(int, convert_string_to_characters(response)))
    ...

但这并不理想,即使是在列表上映射两次的简单情况也是如此。好吧,然后我知道我可以做类似的事情:

[a, b, c, d] = [convert_int_to_bool(int(character)) for character in response]

那是okay,但它又不能很好地扩展到处理函数链,特别是如果里面有一个

filter
。所以我想做的是类似

[a, b, c, d] = response.convert_string_to_characters().map(int).map(convert_int_to_bool)

[a, b, c, d] = response |> convert_string_to_characters() |> map(int) |> map(convert_int_to_bool)

对于第一个提出的方法链接方式,似乎我可以通过扩展 str

list
的内置类型来
潜在地
做到这一点,但是这存在一些问题,因为我读过有关与这些类型的内置文字结构。


是否有任何库或方法可以重载/覆盖内置类型或定义自定义运算符,让我能够以干净的方式执行此操作?谢谢你。

python functional-programming pipeline fluent method-chaining
1个回答
0
投票

是否有任何库或方法可以重载/覆盖内置的 类型或定义自定义运算符,这将允许我在 干净的方式?

我建议看看

pandas
或更准确地说是
pandas.Series.apply
。将 3 个函数应用于整数系列的简单示例。

import pandas as pd
def square(x):
    return x ** 2
def evenify(x):
    return 2 * (x // 2)
def add_one(x):
    return x + 1
s = pd.Series([1,2,3,4,5,6,7,8,9])
s2 = s.apply(square).apply(evenify).apply(add_one)
print(s2)

提供输出

0     1
1     5
2     9
3    17
4    25
5    37
6    49
7    65
8    81
dtype: int64
© www.soinside.com 2019 - 2024. All rights reserved.