【问题标题】:Print eval not working to print variable from string打印 eval 无法从字符串打印变量
【发布时间】:2020-10-21 13:54:01
【问题描述】:
class ddx:
  micro = ["iron deficiency (late)", "chronic disease (late)", "thalassemias", "sideroblastic anemia", "lead poisoning"],
  normo = ["normo"],
  macro = ["macro"]

anemiaType = random.choice(["micro", "normo", "macro"])
print eval('ddx.' + anemiaType)

假设 random.choice 是“微”

我希望能够打印 ddx.micro

我知道我可以创建一大堆 if/else 语句来完成此操作,但它看起来很笨重/不是超级可读。

有人有什么建议吗?

【问题讨论】:

  • 为什么不print(choice([ddx.micro, ddx.normo, ddx.macro])[0])
  • 好主意!但这只是相关代码的一个 sn-p - 我正在使用它是 micro、normo 还是 macro 来确定许多事情。
  • 我建议避免使用 eval,因为它的运行字符串是没有保护的代码。相反,我会使用 getattr 来安全地获取属性print(getattr(ddx, anemiaType))
  • getattr(ddx, anemiaType)

标签: python variables printing eval


【解决方案1】:

10 次中有 9 次要使用 eval 通常有一种更安全的方法。 Eval 将运行任何任意代码,因此当有更好、更安全的方法来执行此操作时,这绝不是一个好主意。在这种情况下你想访问一个类的属性,所以你可以使用getattr

import random

class ddx:
  micro = ["iron deficiency (late)", "chronic disease (late)", "thalassemias", "sideroblastic anemia", "lead poisoning"],
  normo = ["normo"],
  macro = ["macro"]

anemiaType = random.choice(["micro", "normo", "macro"])
print(getattr(ddx, anemiaType))

【讨论】:

    【解决方案2】:

    Nvm 我刚刚意识到我犯了有史以来最愚蠢的 python 3 错误 - 写 print 而不是 print()

    【讨论】:

      【解决方案3】:
      import random
      class ddx:
        micro = ["iron deficiency (late)", "chronic disease (late)", "thalassemias", "sideroblastic anemia", "lead poisoning"],
        normo = ["normo"],
        macro = ["macro"]
      new=ddx()
      anemiaType = random.choice(["micro", "normo", "macro"])
      #print(anemiaType)
      print(eval('new.'+anemiaType))
      

      这对我有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多