Làm thế nào tôi có thể sử dụng lập trình chức năng để tạo một phương thức chung trong python?


9

Tôi muốn cải thiện cách viết mã này. Ngay bây giờ tôi có sáu phương pháp gần như sao chép-dán, chỉ có một dòng đang thay đổi. Làm cách nào tôi có thể tạo một phương thức chung và tùy thuộc vào thuộc tính của dữ liệu đầu vào để thay đổi các phép tính? Tôi đã suy nghĩ để sử dụng lập trình chức năng để đạt được điều đó, nhưng tôi không chắc làm thế nào để làm điều đó đúng.

Phương thức này nhận được một đối tượng dict. Sau đó, đối tượng này được chuyển đổi thành JSON. Các midbiến được lưu trữ một JSON với midrate cho tệ từ API bên ngoài, nó phải có trước khi vòng lặp for nếu không API sẽ được gọi trong mỗi lần lặp và làm chậm này xuống quá trình rất nhiều! Sau đó, trong forvòng lặp, tôi lặp qua dữ liệu từ đầu vào. Sự khác biệt duy nhất giữa các phương thức là tính toán trước khi chèn nó vào danh sách..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

Một trong những phương pháp khác:

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

(Dòng thay đổi là list_p.append()dòng, dành cho những người không rành về mã khác biệt một cách trực quan. :))
AKX

Câu trả lời:


14

Thật vậy, có một cách để giảm mã ở đây với 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
Tiểu nitlog, nhưng tôi thực sự đổi tên mbthành một cái gì đó mô tả hơn khi coi đây là mã tài chính :)
AKX

2
Có lẽ. Nó lên OP.
mario_sunny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.