Python不能很方便的定义常量,这就带来了一些问题,如果一个程序或引用的第三方库,不小心修改了某一个模块下的一个全局变量,比如re模块的re.I,re.M等,这样就会给程序带来很大的不确定性?
re这个例子只不过是一个历史遗留问题,是特例,还是类似的例子在Python中是普遍存在的?
回复内容:
“修改某一模块下的全局变量”,这就是打猴子补丁啊(Monkey patch)。Python的设计思想就是要足够动态,让你方便运行时各种魔改,你看他连private关键字都没,还可以运行着运行着把自己底层标准库给换了(比如gevent里面的monkey patch),区区常量算个毛。 你说的事是普遍存在的。python中任何一个名字都只是个简单绑定,它的实体是什么这一点你随时可以改。像_和__这种用来表示私有的前缀效果也不过是自动改个名而已。这提供了足够高的自由度,让程序员在不直接修改模块的前提下可以改动其内的行为,同时要求程序员自己不要无故作死。像re.M这样的量,关键不在于可不可改,而是应不应该去改。当然这是不安全的。拿JAVA来做对比就会明白Python在安全性上维持的重点在程序员自身。这也是为啥招个『初级』Python程序员会坑死。
当然了,一些特殊的手法可以使得像你举例的那种改动不可执行(例如re.M不再是一个数而是一个随机密钥,在载入模块时生成,具体辨认通过模块内隐藏的函数来执行,而不直接暴露参数本身)。只不过真的没什么必要。 熟悉Python开发哲学的人会质问你不清楚后果为什么要修改别的模块的全局变量?
要是想弄个不能被修改的常量对象也是没问题的,简单地利用元组的 immutable 特性即可:
from collections import namedtuple
def const(**kwargs):
ConstType = namedtuple("Constant", kwargs.keys())
return ConstType(**kwargs)
const1 = const(
name="test", value=123,
)
print const1.name # test
const1.name = "xxxx" # raise AttributeError
别作死…………比如
True, False = False, True
全局变量可以有,但是如果滥用就不好了。考虑你问题的规模,小脚本还好说,如果依赖复杂,大量依赖全局变量,我觉得设计本身可能就有问题。建议将全局变量作为一个类的属性,内部用单下划线来限制外部调用,然后用@property将变量包装成只读属性。 坑还是很多。。 抖个机灵。
在c++里这么定义一下的话……
#DEFINE true false 是。
也许是故意的。 感觉python是提供了足够的便捷,加入常量就如同加入数据类型一样,更多的检查本质上是为了规避编程者本身的问题,让你少犯错,在程序运行之前。为了足够灵活,很多编译型语言的特性拿掉,这些约束就落在了程序员身上,这未尝不是件好事。总之,我清楚我在干嘛,so,我才不会改第三方模块全局变量,也不会True=0,如果我真有这样的需求…很感谢python提供了我这个权限。 这个问题,完美的回答还是等什么时候guido也用知乎了,邀请他回答下,哈哈,知乎愿景。
![PHP编程就业班](http://m.sbmmt.com/img/upload/course/000/000/071/621c25bbac2ca351.png)
相关文章推荐
• 详细介绍Python3数据结构知识点• python实例详解之xpath解析• Python数据结构与算法学习之双端队列• python知识总结之csv文件的写入与读取• 带你搞懂Python反序列化jquery 基础视频教程
jQuery 很容易学习,希望通过我们的《jquery 基础视频教程》可以帮助大家来更好的学习jQuery。 jQuery 是一个 JavaScript 库,简化了 JavaScript 编程。
jQuery教程51617次播放
javascript三级联动视频教程
《javascript三级联动视频教程》介绍了javascript开发的三级联动功能,该功能在日常使用中还是经常能用的到的一个。
JavaScript教程30659次播放
独孤九贱(3)_JavaScript视频教程
javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。没有它,你的前端生涯是不完整的。《php.cn独孤九贱(3)-JavaScript视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了javascript知识。
JavaScript教程120584次播放
独孤九贱(6)_jQuery视频教程
jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等,是全球最流行的前端开发框架之一。PHP中文网根据最新版本,独家录制jQuery最新视频教程,回馈PHP中文网的新老用户。
jQuery教程99773次播放