带有if语句的python exec()

时间:2015-06-16 02:19:29

标签: python python-3.x

我正试图找到一种方法来执行exec()if语句。

所以,例如:

exampleCode = "if 0 < 1:"

exec(exampleCode)
    print("Zero is less than one")

现在,显然这对exec()来说是不可能的。但它有类似的东西吗?

其他可行的方法是:

exampleCode = "if 0 < 1:"

exampleCode
    print("Zero is less than one")

同样,这是不可能的,因为变量不能是代码。

那么,是否有一些 else 可能有效?

4 个答案:

答案 0 :(得分:5)

您可以使用eval

执行此操作
exampleCode = "0 < 1"
if eval(exampleCode):
    print("Zero is less than one")

......但目前还不清楚这样做的好处是什么(也就是说,有些事情是你没有向我们展示的,这会刺激你的问题)。

答案 1 :(得分:2)

使用lambda。我们可以传递一个任意的lambda,它允许动态评估评估范围内的条件:

# A simple lambda with 0 args
cond = lambda: 0 < 1
# <function <lambda> at 0x1084ffc80>
# ... you could of course have a lambda with 3 args or whatever
#cond = lambda x, y, z: some_expression_involving_x_y_z

if cond():
    print("Zero is less than one")

答案 2 :(得分:0)

Python在编译块时必须知道每行代码的语法角色。允许你尝试做的事情会带来很多复杂因素,因为可能会出现像

这样的事情
line = random.choice(['if flag:', '    print(1)'])

flag = True
for i in range(5):
    print(1)
exec(random.choice(['if flag:', '    print(1)'])) # What indentation level is this?
    print(2) # Is this part of the loop?

如果你想做你想要做的事情,你必须让整个块成为一个字符串并exec它,并且从run到run的部分替换为:

template = '''\
{statement}
    print("Zero is less than one")'''

exec(statement.format('if 0 < 1:'))

尽管使用exec通常是一个坏主意。

答案 3 :(得分:0)

如果你正在制作一个类似于&#34的问题的测验程序;那里有什么代码?#34; (至少这是我从你的评论中得到的)而不是字典可以正常工作:

    $qb->select('s')
        ->from('FooChallengeBundle:Slot', 's')
        ->join('s.teams', 't')
        ->groupBy('s')
        ->having('count(t) < s.amount')
        ->getQuery()
        ->getResult();