【问题标题】:How to use the value of a variable as an argument如何使用变量的值作为参数
【发布时间】:2019-05-24 14:48:45
【问题描述】:

我正在尝试使用一个变量的值,它是一个字符串,作为参数,我不断收到“'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 的情况下执行此操作。我还是个新手,经过几个小时的搜索后找不到替代答案。任何帮助将不胜感激。

【问题讨论】:

  • 好吧,你也应该小心global的使用。最好这样做:instance = s33(conn_manager),然后将countconn_key 作为conn_manager 的属性
  • 我的意思是如果connconn_key与其他对象共享,最好让它们属于一个共享对象,并使用依赖注入传递该对象。
  • 类似这样的一个单独的类?
  • from binance.client import Client from binance.websockets import BinanceSocketManager class conn_manager(): def __init__(): client = Client("", "") bm = BinanceSocketManager(client) count = x conn_key = sock(process_trade_message) 抱歉,渲染得很糟糕。
  • 感谢您为我提供搜索关键字以帮助我了解我不知道的内容。它依赖注入是我不知道存在的。现在来了解一下。

标签: python variables arguments


【解决方案1】:

我认为人们在建议 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')

【讨论】:

  • 效果很好,感谢您抽出宝贵时间回答
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2022-12-20
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多