作家
登录

一种Python全局配置规范以及其魔改

作者: 来源: 2017-12-25 12:05:40 阅读 我要评论

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?


一、模块 or global

很多初学者有个误区,就是在Python中须要设备一个全局的参数时,起首想到的是global关键字,而实际上global不是干这个事的,global的功能是在将局部感化域的变量声明为全局的,如许可以在局部修改全局的变量。

但这种用法其实异常不好,按照函数式的规范而言,纯函数的输入应当只有输入参数肯定,不该该在履行过程中引用外部变量。并且,global也不是用来进行全局设备用的。

在Python中,模块是天然的单例,模块会在项目初始化后履行一次,之后一般不反复履行,相符单例模式的特点。是以,应用模块的┞封一特点,将全部工程文件中须要设备的选项都设备到一个模块中,在须要用的模块中经由过程import导入,才是Python中全局设备精确打开方法。

固然这种规范已经在江苟(Django)等开源框架中展示了无数遍,但“如安在Python中设置全局变量”这个问题仍然是Python社区的月经贴。

这个其实是Python中的根本操作了,本来是没啥好讲的,不过在这篇文┞仿最后我展示了一种根据json设备的动态模块,供大年夜家参考。

二、单例字典

在讲募块之前,我想谈谈我测验测验过另一种方法,就是自定义单例字典,具体做法是如许的。

先持续collections模块中MutableMapping,并重写相干接口。这是在Python中自定义数据类型的根本操作了,自定义完成后然后写一个装潢器将持续的类转化成单例的类。

单例模式的写法可以看Stackoverflow上关于单例模式的高票答复。

不过模块有个处所不好就是动态修改不便利,具体到项目中去就是,该项目经由过程工厂模式生成了一系列产品,每个产品所需的设备参数都不一样。

我习惯采取第一种函数装潢器的写法:

这种写法异常好懂得,用一个类变量instances保存该类生成的实例,每次类被调用的时刻断定一下这个类是否在instances字典里,如不雅不在着生成一个实例并放入instances字典。

但这个写法有个问题,装潢后的返回的不是一个类,而是一个函数,固然Python语犯境究一切皆对象,但函数是享受不到类的诸如持续之类的特点的。

如不雅须要返回一个单例类的话须要用元类的写法,或者第四种类装潢器的写法。当然,具体到这里而言,这个类是持续了一个MutableMapping的,不克不及再持续其余元类了,元类的写法在这里不实用。

其实就是经由过程setattr这个常用的给对象动态的添加功能的函数,d.tiems()是一个大年夜json文件中攫取的字典对象。

三、单例字典的问题

单例字典是我在项目初期惹人,并在项目标迭代过程中给我造成最大年夜困扰的一个器械,在开端时几乎将所有的设备都写入到这个字典中,然后在法度榜样运行中这个字典又被分散在法度榜样遍地的各个实例修改,运行到后面根本不知道字典里有什么,字典里的某个内容是否被修悛改。不过因为GIL,倒是不须要推敲锁的问题,可能是独一的一个幸事。

在后期将这个宏大年夜的字典进行重构,重构的过程按照下面的方法进行:

1、将各个类中该字典的引用点,由各个方法术拢到init办法。

不该该

应当

2、将各个引用点的名称同一。

不该该

应当

3、将子函数中直接引用单例字典的参数放到函数的参数列表中,由调用方获取单例字典内容,由传参的办法传入被调用函数,如许做是为了知足函数式编程中纯函数的原则。

不该该这么竽暌姑:

应当如许用

经由过程模块设备全局变量的试例如下,在configs.py中定义CONFIG_A和CONFIG_B。在user.py顶用import导入。

用单例字典做全局设备看着比模块炫酷,其实并没那么好用。原因是单例模式自身的一个弊病,违背了单一职责原则,这个在相干设计模式的教程里有讲到。并且,字典在这一块还有个弊病就是根本不知道须要用到的key是不是存在字典中。

具体的代码见github,重要用来动态修改模块的语句如下:

4、将单一的单例字典分成多个单例字典,并将部分单例字典转换成模块,这个就不举例了。

四、动态模块

模块的用法很简单,在一个文件里设备好,直接import久煨。须要留意的是引用的人口最好在同一个处所。

这里有个办法就是每个产品都经由过程同一个模块来设备,然后在初始化时根据以产品名称定名的一个json文件修改模块的参数。如许就可以达到引用模块的方法不变,但模块的内容是根据json文件的内容来设备的。

五、动态模块的优势

如今,一个设备模块的方檀卷成了导入configs模块,调用update_config_by_name函数,即动态修改函数,并按照响应的json文件修改模块的值。

相对于在每个类初始化时直接调用json设备变量这种筹划是有好处的,定义了configs模块有助于代码的静态检查,形成了一种像C说话中.h文件和.c文件的关系,在头文件中定义相干的变量,在.c文件中实现或应用。这里就成了在configs模块中定义变量,变量的值由json文件肯定,然后在其他模块中经由过程import实现,并且这个器械是全局共享的。当然,这个全局的意思指的是全部说冥器。


  推荐阅读

  11月份运营数据对比:三大运营商谁的数据更好看?

不过整体上看,中国移动仍是一家独大年夜,4G用户达到了6.33891亿户,总用户已经超8亿,远远跨越了中国联通和中国电信的总体用户,几乎在短期内无法赶超。 【限时免费】岁尾最强一次云计算大年夜会,看传>>>详细阅读


本文标题:一种Python全局配置规范以及其魔改

地址:http://www.17bianji.com/lsqh/40134.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)