我正试图找到一种方法来执行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 可能有效?
答案 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();