【问题标题】:Execute a function through the name that is stored in an object通过存储在对象中的名称执行函数
【发布时间】:2022-02-19 02:11:20
【问题描述】:

我想尝试优化代码,但我的想法行不通。

我会从用户那里收到一个值,这个值是一个数字,这个数字我会选择一个要执行的函数。所以我创建了一个具有相同数字的对象,值是应该调用的函数的名称。我在这里尝试了几种方法,但都没有奏效,有人知道该怎么做吗?马上编码

def funcaoSerExecutada():
  modules = {
    1: "funcao1()",
    2: "funcao2",
    3: "funcao3",
    4: "funcao4",
    5: "funcao5",
  }
  userValue = 0



  # Texto que será exebido na tela
  print("===============================")
  print("Escolha o módulo")
  print("===============================")
  print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
  print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
  print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
  print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
  print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
  print("===============================")
  


  # Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
  while (isinstance(userValue, str) or not userValue in modules):
    try:
      userValue = int(input("Digite um número: "))

      if(not userValue in modules):
        print("===============================")
        print("Essa opção não existe! Escolha uma das opções acima!")
        print("===============================")
    except:
      print("===============================")
      print("Ops, digite um número!")
      print("===============================")



  def funcao1():
    print("oi")

  def runFunction():
    modules[userValue]
  runFunction()

【问题讨论】:

  • 这能回答你的问题吗? Python: call a function from string name
  • 这些名称与提示文本有何关系?例如,我们如何从提示“Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3”中得到“funcao1”。是否有一个名为 modelo_cantacom_vitrine_destinos_mod019_V3 的函数,是您要调用的函数吗?
  • 另外,发布一个运行示例 - 目前尚未定义所有要调用的函数。
  • 函数还没有创建,我只是在测试逻辑

标签: python python-3.x


【解决方案1】:

根据答案,我提出了我的解决方案

函数名可以不加引号,但变量必须在其后声明。 所以我所做的就是把那个值放在括号里。

def funcaoSerExecutada():
  # Funcões
  def funcao1():
    print("oi")


  
  userValue = 0
  modules = {
    1: funcao1,
  }



  # Texto que será exebido na tela
  print("===============================")
  print("Escolha o módulo")
  print("===============================")
  print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
  print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
  print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
  print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
  print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
  print("===============================")
  


  # Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
  while (isinstance(userValue, str) or not userValue in modules):
    try:
      userValue = int(input("Digite um número: "))

      if(not userValue in modules):
        print("===============================")
        print("Essa opção não existe! Escolha uma das opções acima!")
        print("===============================")
    except:
      print("===============================")
      print("Ops, digite um número!")
      print("===============================")

  

  def executarFuncao():
    modules[userValue]()
  executarFuncao()

【讨论】:

    【解决方案2】:

    不要将名称放入字典中,而是对函数本身的引用。

      modules = {
        1: funcao1,
        2: funcao2,
        3: funcao3,
        4: funcao4,
        5: funcao5,
      }
    

    您需要将函数定义放在此之前。你用() 调用它。

    def funcaoSerExecutada():
      userValue = 0
    
      # Texto que será exebido na tela
      print("===============================")
      print("Escolha o módulo")
      print("===============================")
      print("1 - Estrutura: modelo_cantacom_vitrine_destinos_mod019_V3")
      print("2 - Estrutura: cantacom_n_mod072_aereas_100_V2;")
      print("3 - Estrutura: canta_destinos_vitrine_novo_modelo_estrutura;")
      print("4 - Estrutura: canta_mod050_estrutura; Obs: Valores apenas para Clube Smiles")
      print("5 - CANTACOM_100MILHAS-SMILESANDMONEY-VERTICAL_V1")
      print("===============================")
      
    
    
      # Pedir para o usuário digitar um valor, verificar se é um número e se essa opção digitada existe
      while (isinstance(userValue, str) or not userValue in modules):
        try:
          userValue = int(input("Digite um número: "))
    
          if(not userValue in modules):
            print("===============================")
            print("Essa opção não existe! Escolha uma das opções acima!")
            print("===============================")
        except:
          print("===============================")
          print("Ops, digite um número!")
          print("===============================")
    
    
    
      def funcao1():
        print("oi")
    
      modules = {
        1: funcao1,
        2: funcao2,
        3: funcao3,
        4: funcao4,
        5: funcao5,
      }
    
      def runFunction():
        modules[userValue]()
      runFunction()
    

    【讨论】:

      【解决方案3】:
      def funcaoSerExecutada(value: int) -> Callable:
        modules = {
          1: funcao1,
          2: funcao2,
          ...
        }
        return modules[value]
      
      user_value = 1
      funcaoSerExecutada(user_value)()
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多