関数型プログラミングを使用してPythonでジェネリックメソッドを作成するにはどうすればよいですか?


9

このコードの記述方法を改善したいと思います。今私はほとんどコピーペーストである6つの方法を持っています、1行だけが変更されています。どのようにしてジェネリックメソッドを作成し、データ入力のプロパティに応じて計算を変更できますか?それを実現するために関数型プログラミングを使用することを考えていましたが、適切に行う方法がわかりません。

メソッドはdictオブジェクトを取得しています。次に、このオブジェクトはJSONに変換されます。mid変数は、外部APIから通貨midrateでJSONを記憶している、それは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

もう1つの方法:

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

回答:


14

実際、ラムダを使用してここにコードを削減する方法があります。

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
マイナーニッピックですが、名前を変更しmbこれが財務コードであることを考慮してよりわかりやすい名前に変更します:)
AKX

2
多分。それはOPの問題です。
mario_sunny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.