返回介绍

01. Python 工具

02. Python 基础

03. Numpy

04. Scipy

05. Python 进阶

06. Matplotlib

07. 使用其他语言进行扩展

08. 面向对象编程

09. Theano 基础

10. 有趣的第三方模块

11. 有用的工具

12. Pandas

动态编译

发布于 2022-09-03 20:46:14 字数 4452 浏览 0 评论 0 收藏 0

标准编程语言

对于 C 语言,代码一般要先编译,再执行。

.c -> .exe

解释器语言

shell 脚本

.sh -> interpreter

Byte Code 编译

Python, Java 等语言先将代码编译为 byte code(不是机器码),然后再处理:

.py -> .pyc -> interpreter

eval 函数

eval(statement, glob, local)

使用 eval 函数动态执行代码,返回执行的值:

In [1]:

a = 1

eval("a+1")

Out[1]:

2

可以接收明明空间参数:

In [2]:

local = dict(a=2)
glob = {}
eval("a+1", glob, local)

Out[2]:

3

这里 local 中的 a 先被找到。

exec 函数

exec(statement, glob, local)

使用 exec 可以添加修改原有的变量。

In [3]:

a = 1

exec("b = a+1")

print b
2

In [4]:

local = dict(a=2)
glob = {}
exec("b = a+1", glob, local)

print local
{'a': 2, 'b': 3}

执行之后,blocal 命名空间中。

警告

动态执行的时候要注意,不要执行不信任的用户输入,因为它们拥有 Python 的全部权限。

compile 函数生成 byte code

compile(str, filename, mode)

In [5]:

a = 1
c = compile("a+2", "", 'eval')

eval(c)

Out[5]:

3

In [6]:

a = 1
c = compile("b=a+2", "", 'exec')

exec(c)
b

Out[6]:

3

abstract syntax trees

In [7]:

import ast

In [8]:

tree = ast.parse("a+2", "", "eval")

ast.dump(tree)

Out[8]:

"Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Num(n=2)))"

改变常数的值:

In [9]:

tree.body.right.n = 3

ast.dump(tree)

Out[9]:

"Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Num(n=3)))"

In [10]:

a = 1
c = compile(tree, '', 'eval')

eval(c)

Out[10]:

4

安全的使用方法 literal_eval ,只支持基本值的操作:

In [11]:

ast.literal_eval("[10.0, 2, True, 'foo']")

Out[11]:

[10.0, 2, True, 'foo']

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文