首页 > 解决方案 > 如何使用变量的值作为参数

问题描述

我正在尝试使用一个变量的值,它是一个字符串,作为参数,我不断收到“'Str' not callable'错误。我没有使用 str 作为变量名,我可以让代码使用eval,但是,我已经阅读了关于 的可怕警告eval,所以我不确定该怎么做。我的代码如下。

from time import sleep
from binance.client import Client
from binance.websockets import BinanceSocketManager


class s33():    

    def __init__(self):

        self.client = Client("", "")
        self.bm = BinanceSocketManager(self.client)



    def process_trade_message(self, message):
        global count, conn_key
        print(count)
        if count >= 10:

            print('closing socket')
            # use either stop_socket or close, or both
            self.bm.stop_socket(conn_key)
            self.bm.close()

            # reset the count
            count = 0

    def go(self, sockb):
        global count, conn_key


        print(sockb['1'])
        sock = 'self.bm.'+sockb['1']
        print(sock)
        count = 0
        conn_key = sock(self.process_trade_message)

        self.bm.start()


if __name__ == '__main__':

    while True:
        s = s33()
        socka = {'1':'start_miniticker_socket'}
        s.go(socka)
        sleep(20)
        print('sleeping')

我读过人们推荐使用 dict,所以我将 dict 作为 arg 传递并尝试在函数中提取字符串,即下面的代码。我试图提取字符串并将其作为 arg 传递给函数。s.go(socka['1'],我尝试将变量作为参数传递,如果我使用百分号但没有运气socka = 'start_miniticker_socket',我可以让它工作。eval('self.bm'+socka)不知道如何在不使用 eval 的情况下执行此操作。我还是很新,经过几个小时的搜索后找不到替代答案。任何帮助,将不胜感激。

标签: pythonvariablesarguments

解决方案


我认为人们在建议 dict 时的意思是这样的:

class s33():
    # Codes...
    def go(self, func_name):
        global count, conn_key

        print(func_name)
        mapper = {
            'start_miniticker_socket': self.bm.start_miniticker_socket
        }
        # Get self.bm.start_miniticker or None
        sock = mapper.get(func_name)
        print(sock)
        if sock:
            count = 0
            conn_key = sock(self.process_trade_message)

            self.bm.start()
        else:
            pass # Handle when sock is None

if __name__ == '__main__':
    while True:
        s = s33()
        socka = 'start_miniticker_socket'
        s.go(socka)
        sleep(20)
        print('sleeping')

推荐阅读