我正在尝试使用变量的值(即字符串)作为参数,并且不断收到“'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的情况下进行操作。我还很新,经过几个小时的搜索后找不到其他答案。任何帮助将不胜感激。
答案 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')