是否可以在Python3中的特定功能之外附加代码行?

时间:2019-02-01 15:16:23

标签: python python-3.x

我正在尝试获取加密货币交易所的订单簿如何支持特定货币对(例如ETH / BTC)。因为我的函数需要每分钟运行一次,所以每次检查都非常耗时。我正在使用ccxt来获取交易所的订单。

使用此行代码,我检查每个交换。

import ccxt

binance   = ccxt.binance()
livecoin  = ccxt.livecoin()
kucoin    = ccxt.kucoin()
hitbtc    = ccxt.hitbtc()
kraken    = ccxt.kraken()
crex24    = ccxt.crex24()
okex      = ccxt.okex()

headerList = ["time","type","pair"]

try:
    orderbookBinance = binance.fetch_order_book(self.pair,5)
    headerList.append("binance")
    headerList.append("binanceAmount")
except:
    print("Pair isn't available in binance")

try:
    orderbookLivecoin = livecoin.fetch_order_book(self.pair,5)
    headerList.append("livecoin")
    headerList.append("livecoinAmount")
except:
    print("Pair isn't available in livecoin")

try:
    orderbookKucoin = kucoin.fetch_order_book(self.pair,5)
    headerList.append("kucoin")
    headerList.append("kucoinAmount")
except:
    print("Pair isn't available in kucoin")

try:
    orderbookHitbtc = hitbtc.fetch_order_book(self.pair,5)
    headerList.append("hitbtc")
    headerList.append("hitbtcAmount")
except:
    print("Pair isn't available in hitbtc")

try:
    orderbookKraken = kraken.fetch_order_book(self.pair,5)
    headerList.append("kraken")
    headerList.append("krakenAmount")
except:
    print("Pair isn't available in kraken")

try:
    orderbookCrex24 = crex24.fetch_order_book(self.pair,5)
    headerList.append("crex24")
    headerList.append("crex24Amount")
except:
    print("Pair isn't available in crex24")

try:
    orderbookOkex = okex.fetch_order_book(self.pair,5)
    headerList.append("okex")
    headerList.append("okexAmount")
except:
    print("Pair isn't available in okex")

现在,如果可以尝试,我需要添加所有try块的第一行。在python中有可能吗?

1 个答案:

答案 0 :(得分:0)

您在这里采用了错误的方法。

“代码行”,就像变量名应该在程序中固定一样。 Python的超动态特性甚至允许人们“添加代码行”,并在运行时重新编译模块-但这将是复杂,复杂,矫kill过正,并且在您需要的只是简单明了的情况下会出现很多错误。方法

您需要的是将引用外部交换的对象保留在数据结构中,例如纯字典。然后,您只需要遍历字典即可执行方法调用和每个字典所需的其他操作-程序的任何部分都可以使用简单的普通属性来更新字典。

import ccxt


exchanges = {}
for exchange_name in "binance livecoin kucoin hitbtc kraken crex24 okex".split():
    exchanges[exchange_name] = getattr(ccxt, exchange_name)()

...
for exchange_name, exchange in exchange.items():
    try:
        orderbook = exchange.fetch_order_book(self.pair,5)
        headerList.append(exchange_name)
        headerList.append(f"{exchange_name}Amount")
    except:
        print(f"Pair isn't available in {exchange_name}")

如果在某些交易所的实际代码中需要运行不同的代码,则只需改进数据结构:您可以创建另一个内部字典,而不是将交换名称直接与交换实例关联,而可以创建另一个内部字典,键/值对不仅是ccxt交换实例,而且还包括要调用的方法的名称,要传递给每个方法的参数,在响应中检查什么等:

程序中的代码是固定的!可以根据数据结构中存在的配置数据来运行它的一部分。