如何使用函数式编程在python中创建通用方法?


9

我想改进这段代码的编写方式。现在,我有六种方法几乎都是复制粘贴的,只有一行正在更改。如何制作通用方法,并根据数据输入的属性更改计算?我当时在考虑使用函数式编程来实现这一目标,但是我不确定如何正确地做到这一点。

该方法正在获取dict对象。然后将此对象转换为JSON。该mid变量存储的JSON具有来自外部API的中值货币,必须在for循环之前,否则该API将在每次迭代中调用,这会大大减慢该过程!然后在for循环中,我遍历输入中的数据。方法之间的唯一区别是将其插入列表之前的计算。.append(mid_current - bankMSell)

def margin_to_exchange_rate_sell(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current - bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

另一方法:

def margin_to_exchange_rate_buy(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current + bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

(list_p.append()对于那些不太擅长在视觉上区分代码的行,更改的行是该行。:))
— AKX

Answers:


14

实际上,这里有一种方法可以使用lambdas减少代码:

def margin_to_exchange_rate_sell(data):
    return margin_to_exchange_rate(data, lambda m, b: m - b)


def margin_to_exchange_rate_buy(data):
    return margin_to_exchange_rate(data, lambda m, b: m + b)


def margin_to_exchange_rate(data, operation):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(operation(mid_current, bankMSell))
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

2
较小的nitpick,但考虑到这是金融代码,我真的要重命名m并b进行更具描述性的内容:)
— AKX

2
大概。这是OP。
— mario_sunny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.