首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度辨析 Python 的 eval() 与 exec()

'Python猫', 'age': 18} eval() 函数的返回值是其 expression 的执行结果,在某些情况下,它会是 None,例如当该表达式是 print() 语句,或者是列表的 append...() 操作时,这类操作的结果是 None,因此 eval() 的返回值也会是 None。...>>> result = eval('[].append(2)') >>> print(result) None exec() 函数的返回值只会是 None,与执行语句的结果无关,所以,将 exec()...在默认情况下,eval 函数的 globals 参数会隐式地携带__builtins__ ,即使是令 globals 参数为 {} 也如此,所以如果想要禁用它,就得显式地指定它的值。...>>> eval("2 ** 888888888", {"__builtins__":None}, {}) 如上所述,我们直观地展示了 eval() 函数的危害性,然而,即使是 Python 高手们小心谨慎地使用

62520
您找到你想要的搜索结果了吗?
是的
没有找到

深度辨析 Python 的 eval() 与 exec()

'Python猫', 'age': 18} 复制代码 eval() 函数的返回值是其 expression 的执行结果,在某些情况下,它会是 None,例如当该表达式是 print() 语句,或者是列表的...append() 操作时,这类操作的结果是 None,因此 eval() 的返回值也会是 None。...>>> result = eval('[].append(2)') >>> print(result) None 复制代码 exec() 函数的返回值只会是 None,与执行语句的结果无关,所以,将 exec...在默认情况下,eval 函数的 globals 参数会隐式地携带__builtins__ ,即使是令 globals 参数为 {} 也如此,所以如果想要禁用它,就得显式地指定它的值。...>>> eval("2 ** 888888888", {"__builtins__":None}, {}) 复制代码 如上所述,我们直观地展示了 eval() 函数的危害性,然而,即使是 Python

54550

深度辨析 Python 的 eval() 与 exec()

'Python猫', 'age': 18} eval() 函数的返回值是其 expression 的执行结果,在某些情况下,它会是 None,例如当该表达式是 print() 语句,或者是列表的 append...() 操作时,这类操作的结果是 None,因此 eval() 的返回值也会是 None。...>>> result = eval('[].append(2)') >>> print(result) None exec() 函数的返回值只会是 None,与执行语句的结果无关,所以,将 exec()...在默认情况下,eval 函数的 globals 参数会隐式地携带__builtins__ ,即使是令 globals 参数为 {} 也如此,所以如果想要禁用它,就得显式地指定它的值。...>>> eval("2 ** 888888888", {"__builtins__":None}, {}) 如上所述,我们直观地展示了 eval() 函数的危害性,然而,即使是 Python 高手们小心谨慎地使用

2.9K00

深入理解python面向对象-特殊成员(补)

返回实例化的对象,如果返回None,则__init__方法不会被调用 __init__方法的self参数就是__new__返回的实例 我们在使用类名创建对象时,会先调用__new__方法,分配内存空间...使用场景 单例模式 class A: instance = None def __init__(self): print("A") def __new__(cls...A的__new__函数中打印的cls也是B,所以这就是super的原因了。如果把__new__中的super()换成object呢? B....) a.func() # 输出:func 这种方式绑定的方法,只在此对象中存在,其他对象是不存在的 给类绑定方法 class A: pass def test(self): print...("test") a = A() A.test = test a.test() # 输出:test 这种绑定方式会给类增加一个方法,在此类所定义的所有对象中都可以调用,即使是在绑定方法之前所定义的对象也可以

58910

Python字典及基本操作(超级详细)

此外,还有一点需要指出,列表的索引总是从 0 开始、连续增大的;但字典的索引即使是整数类型,也不需要从 0 开始,而且不需要连续。...它相当于方括号语法的增强版,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;但如果使用 get() 方法访问不存在的 key,该方法会简单地返回 None,不会导致错误。...但该方法有一个额外的功能,即当程序要获取的 key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value。 ...总之,setdefault() 方法总能返回指定 key 对应的 value;如果该 key-value 对存在,则直接返回该 key 对应的 value;如果该 key-value 对不存在,则先为该...例如如下代码:    # 使用列表创建包含2个key的字典  a_dict = dict.fromkeys(['a', 'b'])  print(a_dict) # {'a': None, 'b': None

53620

Python字典及基本操作(超级详细)

此外,还有一点需要指出,列表的索引总是从 0 开始、连续增大的;但字典的索引即使是整数类型,也不需要从 0 开始,而且不需要连续。...,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;但如果使用 get() 方法访问不存在的 key,该方法会简单地返回 None,不会导致错误。...但该方法有一个额外的功能,即当程序要获取的 key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value。...总之,setdefault() 方法总能返回指定 key 对应的 value;如果该 key-value 对存在,则直接返回该 key 对应的 value;如果该 key-value 对不存在,则先为该...2个key的字典 b_dict = dict.fromkeys((13, 17)) print(b_dict) # {13: None, 17: None} 使用元组创建包含2个key的字典,指定默认的

1.5K10

python基础—dict

> ``` d = {1: 'a', 2: 'b'} d[1] 'a' get(key,default) 返回key对应的值value key不存在返回缺省值,如果没有...value key不存在返回给定的default 如果default没有设置,那么当key不存在时,使用pop会抛出异常 d.pop(5) 'a' d.pop(6,'not exist...print(d.get(k)) 或 for v in d.values(): print(v) 或 for _,v in d.items(): print(v) defaultdict...第一个参数是default_factory,缺省是None,它提供一个初始化函数,当key不存在的时候,会调用这个工厂函数来生成key对应的value OrderedDict使用 collections.OrderedDict...([items]) key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序 有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印 3.6版本的字典就是记录Key

46420

Python编程中的反模式

在C语言时代或者更早,当int统治编程世界的时候,对于需要返回一个期望的错误结果的函数来说为通用的模式为返回-1。...例如,当你想要返回列表中某一元素的索引值: def find_item(item, alist): # None比-1更加Python化 result = -1 for idx,...由于print_file的调用在外作用域中(即使有缩进),这里声明的filename对于print_file函数是可见的。 那么如何避免这样的错误呢?...作为哨兵,这也是Python风格所期望的模式,例如在你想要区分None和0的时候。...str在string中开始的索引值,如果不存在返回-1; [3] 在外作用于中不要给函数中的局部变量名设置任何值,以防止函数内部调用局部变量时发生错误而调用外部作用域中的同名变量。

1.1K60

刚才,我发现了Python强大的内置模块collections

如此一来,我们用 namedtuple 可以很方便地定义一种数据类型,它具备 tuple 的不变性,又可以根据属性来引用,使用十分方便。...()#反转deque中的元素,并返回None; list2=[1,3,4,5] delist.extend(list2)#将可迭代变量iterable中的元素添加至deque的右侧...使用 dict 字典类型时,如果引用的 key 不存在,就会抛出 KeyError。如果希望 Key 不存在时,返回一个默认值,就可以用 defaultdict。...def testDefaultdict(): dict1= defaultdict(lambda: 'default') #Key不存在时,返回一个默认值,就可以用default,defaultdict...(str2) #从输出的内容来看,Counter实际上也是dict的一个子类 for k,v in str2.items(): print(k,v) dict3 = {

27010

Python字典方法

': 'mlh'} 当替换副本中的值时,原字典不受影响,如果修改副本的值,原字典也随着改变,因为原字典指向的也是被修改的值 3、fromkeys 创建一个新字典,其中包含指定的键,且每个键对应的值都是...None d = dict.fromkeys(['name','age']) print(d) {'age': None, 'name': None} d = dict.fromkeys(['name1...','name2'],'chengzi') print(d) {'name1': 'chengzi', 'name2': 'chengzi'} 4、get 访问字典key,获取value,使用get访问不存在的...key时,不会引发异常,返回None d = {'name': 'chengzi','age':20} print(d.get('class')) print(d.get('name')) None...(d.pop('name')) print(d) chengzi {'age': 20} 8、setdefault 有点像get,如果指定的key存在,返回对应的value,指定的key不存在,将key

34810

__getattr__

正常情况下,当调用类的方法或属性时,如果不存在,就会报错 要避免这个错误,除了可以加上那个要调用但不存在的属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性...AttributeError('\'Student\' object has no attribute \'%s\'' % attr) s = Student() print...(s.name) #输出:'Michael' print(s.score) #输出:99,当调用不存在的score属性时,Python解释器会调用__getattr__(self,...'score')来尝试获得属性,这样就会返回score的值 s.age() #输出:25,返回函数也是完全可以的 print(s.abc) #输出:None,任意调用如s.abc...都会返回None,因为定义的__getattr__默认返回就是None 可以把一个类的所有属性和方法调用全部动态化处理了,不需要任何特殊手段 这种完全动态调用的特性的作用就是,可以针对完全动态的情况作调用

56210

Python中的命名空间和作用域(2)

print(locals())... >>> f(10, 0.5) {'s': 'foo', 'y': 0.5, 'x': 10} 在f()中调用locals()时,locals()返回表示函数的本地命名空间的字典...注意,除了本地定义的变量s之外,本地命名空间还包括函数参数x和y,因为它们也是f()的本地参数。 如果在函数外部调用locals() ,那么它与globals()用法相同。...print(s) 11 ... 12 13 >>> f() 14 {'s': 'foo'} 15 {'s': 'foo'} 16 foo 在本例中,loc指向local()的返回值,它是本地命名空间的一个副本...如果全局声明中指定的名称在函数启动时不存在于全局作用域中,则global语句和赋值的组合将创建这一名称: 1 >>> y 2 Traceback (most recent call last):...一般认为修改全局变量是不明智的,不仅在Python中如此,在其他编程语言中也是如此。 和许多事情一样,这个问题可以归结为风格和偏好。对全局变量进行审慎和明智的修改有时可以降低程序的复杂性。

1K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券