【问题标题】:Python: Using bool() to select which vars are TRUE, then use those values to call functionPython:使用 bool() 选择哪些变量为 TRUE,然后使用这些值调用函数
【发布时间】:2021-05-18 17:09:31
【问题描述】:

有史以来第一个问题!我已经构建了一个 GUI,它要求用户输入可能的 5 个值中的 2 个。每对值(10 个可能的对)用于运行名为 Case_n 的 10 个不同的求解函数,所有五个值(零和非零)都传递给这些函数。
我遇到的问题是将 bool() 结果剥离到没有括号等的 2 位数字,然后放入用于创建要调用的函数名称的变量中。 我已经运行了逻辑,将 TRUE 值添加到列表中,然后将列表转换为字符串,以便我可以将其剥离为仅数字,保存 2 位字符串并将其添加到 Case_n 名称中。现在,当我尝试使用该名称调用该函数时,我收到一个字符串不可调用的错误。请帮忙 。 . .

  s = 5    #vars.  For this example, I've pre-loaded 2 of them
  a = 15
  l = 0
  r = 0
  e_deg = 0
  ve = 0


  case = []
  if bool(s):
      case.append(1)
  if bool(a):
      case.append(2)
  if bool(l):
    case.append(3)
  if bool(r):
     case.append(4)
  if bool(e_deg):
      case.append(5)
  
  nm = str(case)  # placeholder to convert case to string
  case_num = nm[1] + nm[4]  # this returns 12 as a string

  # create case_num var, using the string

  Case = "Case_" + case_num
  print("Case = ",Case)         # Should be Case_12


  def Case_12(s,a,l,r,e_deg,ve):
      print("Case_12 running")  

  Case(s,a,l,r,e_deg,ve)  ```

【问题讨论】:

    标签: python string formatting boolean callable


    【解决方案1】:

    您可以只使用eval(Case),但我建议您不要使用它,因为您正在处理用户输入,这可能会带来安全风险。 一种简单的方法是构建以下字典:

    my_dict = {"Case_1": Case_1, ..., "Case_12" : Case_12}
    

    然后,您可以不调用 Case,而是这样做

    my_dict[Case](s,a,l,r,e_deg,ve)
    

    你也可以创建一个函数:

    def choose_case(my_case_as_str):
       my_case_dict = {"Case_1": Case_1, ..., "Case_12": Case_12}
    
       return my_case_dict[my_case_as_str]
    

    然后调用

    choose_case(Case)(s,a,l,r,e_deg,ve)
    

    顺便说一句,您可能不希望您的函数和变量名称以大写字母开头。您可能还想使用更安全的方式来获取用户输入(例如使用Template str

    【讨论】:

    • 感谢您提供快速有用的解决方案。我期待着通过他们工作。 P
    • 再次感谢加布里埃尔。我实现了字典方法,它工作正常。它的代码比我原来的方法少一点,但我仍然很好奇是否有更简单的解决方案,不涉及转换为字符串并去除多余的字符。
    • def get_case_number(l): my_case = l[0]*10 + l[1] return "Case_{:d}".format(my_case)。然后 get_case_number(case) :像这样,您无需手动转换即可获得案例
    • 加布里埃尔,感谢您的变化。到目前为止,转换为字符串然后使用 dict 是最少的代码并且运行良好。 :) P
    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多