python eval()函数-将字符串转变量进行赋值或计算

python eval()函数

在项目的开发过程中遇到根据字典或者相关命名进行获取与字符串相同的变量,并进行下一步的计算,所以了解一下eval()函数,顺带介绍了globals()locals()函数。

官方文档:https://docs.python.org/3/library/functions.html?highlight=eval#eval

python自带的eval()函数可以将传递的字符串转化成对应的函数,字符串内的变量引用当前模块的变量参与计算。

在使用过程中一般会传递一些字符串,根据字符串获取与当前字符串相同变量的值。比如:

# 定义变量
message = 'hello, python eval()'

info = eval('message')

print(info)  # hello, python eval()

eval(expression[, globals[, locals]])

下述代码位置:
https://gitee.com/hanhongwen/python-base/blob/master/py_function/fun_eval.py

eval()函数传递参数是字符串,以及可选的参数globals()locals()。 globals 实参必须是一个字典。locals 可以是任何映射对象。

eval()函数传递的参数是字符串,可以获取当前模块全局的变量作为参数,进行计算。

# -*- coding: utf-8 -*-

# eval(expression[, globals[, locals]])

x  = 1

def fun_eval(z):

    print(eval('x + 1'))  # x + 1 = 2
    print(eval('z + 1'))  # z + 1 = 3

if __name__ == '__main__':
    fun_eval(2)

eval()函数选择globals()参数,那么在函数内的参数作为字符串传入时会提示报错,找不多对应的命名变量。
这是因为globals()返回实现当前模块命名空间的字典。对于函数内的代码,这是在定义函数时设置的,无论函数在哪里被调用都保持不变。

# -*- coding: utf-8 -*-

# eval(expression[, globals[, locals]])

x  = 1

def fun_eval_globals(z):

    print(eval('x + 1', globals()))   # x + 1 = 2
    print(eval('z + 1', globals()))   # NameError: name 'z' is not defined

if __name__ == '__main__':
    fun_eval_globals(2)

eval()函数选择locals()参数,会与之相反,全局变量获取不到,也会提示对应的错误。
同样是因为locals()更新并返回表示当前本地符号表的字典。在函数代码块但不是类代码块中调用 locals() 时将返回自由变量。

请注意在模块层级上,locals()globals() 是同一个字典。

# -*- coding: utf-8 -*-

# eval(expression[, globals[, locals]])

x  = 1

def fun_eval_locals(z):

    print(eval('z + 1', locals()))  # z + 1 = 3
    print(eval('x + 1', locals()))  # NameError: name 'x' is not defined

if __name__ == '__main__':
    fun_eval_locals(2)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在那路边

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值