如何将变量的值用作参数

时间:2018-12-26 09:57:31

标签: python variables arguments

我正在尝试使用变量的值(即字符串)作为参数,并且不断收到“'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'],我尝试仅将变量作为arg传递,socka = 'start_miniticker_socket',如果我使用eval('self.bm'+socka),我尝试使用百分号没有任何运气,那么我可以使它正常工作。不知道如何在不使用eval的情况下进行操作。我还很新,经过几个小时的搜索后找不到其他答案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为人们建议字典时的意思是这样的:

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')