可以在python中使用变量作为代码

时间:2015-02-09 10:00:38

标签: python django django-queryset

差不多20年前,当我学习perl时,我记得你可以将变量作为代码。我不知道为什么这不起作用所以 我很想知道在python中“插入变量是否可以成为代码”。

例如:

def count_usages():

    fields_ls = ['reporter', 'creator', 'assignee', 'duedate']

    counts = {}

    for field in fields_ls:
        null_crit = field + "__isnull=True"
        blank_crit = field + "__exact=''"

        counts[field] = Ticket.objects.exclude(null_crit).exclude(blank_crit).count()


    for key, value in counts.iteritems():
        print "## - for " + key + " we had " + value

在某种程度上,我认为Python是“编译”的,所以我猜这样的运行时评估不会起作用,但我很想知道。

请指教。谢谢!

2 个答案:

答案 0 :(得分:6)

不,但你永远不会想要这样做。总是使用字典。

for field in fields_ls:
    null_crit = {field + "__isnull": True}
    blank_crit = {field + "__exact": ''}

    counts[field] = Ticket.objects.exclude(**null_crit).exclude(**blank_crit).count()

(Python拒绝这样做与#34;编译"无关;它与Perl一样编译。)

答案 1 :(得分:2)

看到它的运作方式;

name = "False"
if name:
  print(name)

输出'False'因为name非空str所以评估为True

if eval(name):
  print(name)
else:
  print('no')

输出'no'因为已在currnet全局变量和局部变量的上下文中评估了name的内容。

但是赋值不能使用eval,因为在Python中,赋值不是表达式而eval需要表达式。

这是eval的错误;

s = "name=True"
eval(s)

要在字符串中执行语句,您必须使用exec

s = "name=True"
exec(s)

现在name定义为bool类型,其值为True