【问题标题】:Checking if the value of a string is true - python检查字符串的值是否为真 - python
【发布时间】:2017-01-11 00:19:45
【问题描述】:

我试图查看一个字符串是真还是假,但我卡住了......在下面的代码中,我列出了我想要评估的语句,我将它们放在字符串中,因为变量需要是在列表之后声明。(原因是要评估的语句列表作为参数传递给函数,在这个函数中声明了变量)我想遍历列表中的所有项目,如果它是一个真实的陈述然后做一些事情......这是我的代码:(没有生成输出)

a = ['b > c', 'b = c', 'b < c']

b = 5
c = 3

for item in a:
    if exec(item):
       print(item)

【问题讨论】:

  • 你可以使用eval(item),但一般不推荐
  • 变量需要在list之后声明
  • 好的,我现在已经这样做了^^ @DavidZemens

标签: python string list loops if-statement


【解决方案1】:

exec 是 python3.x1 中的一个函数,它返回 None 所以你总是会得到一个虚假的结果。你可能想要eval

这里也要小心。除非您完全信任输入字符串,否则不要使用它,否则它将允许执行任意代码。


请注意,这是一个非常奇怪的代码设计,可能有更好的方法来完成你想要的......例如:

为什么要在定义变量之前定义字符串?以这种方式将字符串与代码中的名称耦合可能会导致痛苦的代码维护体验。

1在 python2.x 中,这将失败并返回 SyntaxError,因为 exec 是 python3.x 之前的 语句


在尝试进一步了解您的用例后,我建议您创建一个 API 来传递函数。

def f1(a, b, **kwargs):
    return a > b

def f2(a, b, **kwargs):
    return a == b

def f3(a, c, **kwargs):
    return a <= c

funcs = [f1, f2, f3]

现在您可以定义一个将传递参数的函数。您需要定义它打算传递的哪些参数——但它总是会将它们全部传递:

def func_caller(funcs):
    param_map = {
        'a': get_a_somehow(),
        'b': get_b_somehow(),
        'c': get_c_somehow(),
        ...
    }
    for func in funcs:
        if func(**param_map):
            print("Hello World!")

还有其他方法可以使 func_caller 与其调用的函数之间的“契约”更具绑定性(例如,将参数作为更结构化的对象传递,例如 namedtuple)。

from collections import namedtuple
FuncCallerParams = namedtuple('FuncCallerParams', 'a,b,c')

def f1(func_caller_params):
   return func_caller_params.a > func_caller_params.b
...

funcs = [f1, f2, ...]

def func_caller(funcs):
    a = ...
    b = ...
    c = ...
    fcp = FuncCallerParams(a, b, c)
    for func in funcs:
        if func(fcp):
           ...

【讨论】:

  • 我这样做的原因是我想列出'a'作为参数传递给函数。在这个函数中声明了变量。有什么建议? @mgilson
  • @N.Chalifour -- 我不确定我是否理解......这是否需要列表的创建者a 知道函数的详细实现细节(例如,其中使用的变量名称?)这似乎是分离关注点的一种非常糟糕的方式。变量bc 代表什么?他们的价值观从何而来?
  • 在实际代码中,bc 实际上是 pbpeg(还有其他),它们是公司的统计数据......我需要检查是否例如,对于每个公司@mgilson,该统计数据的值低于 1
猜你喜欢
  • 2017-11-30
  • 1970-01-01
  • 2022-07-31
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2017-11-28
相关资源
最近更新 更多