【问题标题】:What does eval(dir()[0]) do in pythoneval(dir()[0]) 在 python 中做了什么
【发布时间】:2018-08-27 20:19:24
【问题描述】:

我在 python 中遇到了一个程序的解决方案,但即使在搜索之后我也无法理解它的作用。有人可以解释一下这个声明会做什么。

a, b, c = map(numpy.array,eval(dir()[0]))

【问题讨论】:

  • 哪一部分你不明白?
  • 一般来说,每当你看到evalexec的来电时,在你的左肩上吐三下然后逃跑,因为stackoverflow.com/questions/1832940/…
  • eval(dir()[0]) 既可怕又脆弱。不要以此为例说明你应该在自己的代码中做什么。
  • dir()[0] 是当前本地命名空间中的名字,按字母顺序排序。 eval 评估该名称以获取它所代表的对象。 map 然后迭代它并执行numpy.array(x) for x in eval(dir()[0])。然后我们假设evaled 对象中有三个项目,并将来自map 的三个数组分配给这些变量。
  • Apparently this is supposed to be an exploit vector against auto-grading of online code challenges,这就是为什么他们在做一些在正常程序中没有意义的事情。

标签: python python-3.x python-2.7 dictionary eval


【解决方案1】:

函数dir,在不带参数调用时返回所有局部变量的名称,类似于locals().keys()

def f(y):
     print(dir())  # prints ['y']

那么,很明显,dir()[0] 是第一个局部变量的名称,eval(dir()[0]) 计算变量名称,即返回第一个局部变量的值。

def f(y):
     print(dir())  # prints ['y']
     print(dir()[0])  # prints 'y'
     print(eval(dir()[0]))  # prints the value of y

例如:

>>> f(77)
['y']
y
77
>>> f([1,2,3])
['y']
y
[1, 2, 3]

函数map 使用第二个参数(必须是可迭代的)中的每个值调用第一个参数(必须是可调用的),并生成结果,例如

>>> for result in map(str.upper, ['foo', 'bar', 'baz']):
...     print(result)
...
FOO
BAR
BAZ

将它们组合在一起,假设第一个局部变量是一个名为first_variable的列表,那么这段代码:

a, b, c = map(numpy.array,eval(dir()[0]))

将与此代码相同:

a, b, c = first_variable
a = numpy.array(a)
b = numpy.array(b)
c = numpy.array(c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2011-03-11
    • 2019-01-13
    • 2020-10-13
    • 2018-12-04
    相关资源
    最近更新 更多