[Python Tips]去除 Trivial 赋值语句
写 python 这么久,其实有许多小技巧记在了脑子里,当然,其中也烂掉了不少。今天正好有同事问关于怎么去除 trivial 赋值语句问题,觉得应当以此为契机,养成把这些小技巧记录下来发表到博客上的习惯,一来不会久了之后技巧烂在了脑子里,二来也许能对别人有所裨益呢?
trivial 赋值语句的问题在于许多 python 程序员有着丰厚的 C/C++ 背景,习惯在 __init__() 函数里“声明”成员变量,写 python 的时候积习难改,如:
>>> class Foo(object):
... def __init__(self):
... self.attr1 = 0
... self.attr2 = ''
... self.attr3 = []
... self.attr4 = {}
...
其实从 python 代码美学来讲,这样的代码是不 pythonic 的(什么是 pythonic?请参阅:http://blog.csdn.net/lanphaday/archive/2008/08/03/2762251.aspx)。因为这种代码过早地引入了静态特性,可能使代码充斥着 if…else,而且不利于测试(它不会提前崩溃)。虽然由此,但有时你免不了要这样写,如:
>>> class ConnetConfig(object):
... def __init__(self, host, port):
... self.host = host
... self.port = port
...
但这样的类写多了你就会很烦,因为还有 DatabaseConfig,还有……。怎么办?答案是写一个万能的成员变量自动生成类:
>>> class Config(object):
... def __init__(self, **kw):
... self.__dict__.update(kw)
...
不明白 **kw ?Ok~有个机会让你下定决心去看 python manuals 了,关了这个网页,手册之后,欢迎回来。
有了这个强悍 Config,之前的 ConnectConfig 大概可以这样写:
>>> cfg = Config(host = '127.0.0.1', port = '8080')
>>> print "%s:%s"%(cfg.host, cfg.port)
127.0.0.1:8080
再来一个:
>>> db_cfg = Config(host = ‘127.0.0.1’, port = ‘3876’, user = ‘foo’, passwd = ‘’, db = ‘bar’)
>>> print ','.join('%s=%s'%(k, v) for k, v in db_cfg.__dict__.iteritems())
passwd=,host=127.0.0.1,db=bar,user=foo,port=3876s
这里 print 语句对 __dict__ 的存取未免显得太过粗暴了,有若干种方法可以做得温柔一些,但与本文的主题不符,我下次再找机会写写。
其实如果真的是这么简单的类,我是不推荐写成一个 class 的,这是典型的一切都必须是类的深度中毒现象。但是这写成这样我也不知道又是一种什么思想的深度中毒现象了:
>>> def Config(**kw):
... obj = type('Config', (), kw)()
... return obj
...
>>> c = Config(host = '127.0.0.1', port = '8080')
>>> c.host, c.port
('127.0.0.1', '8080')
晕,开始变态了,就此打住!一般情况还是直接传一个 dict 对象的引用过去为好,简简单单才是 python 的追求。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lanphaday/archive/2008/09/09/2905877.aspx
分享到:
相关推荐
python库,解压后可用。 资源全名:trivial_tools-1-py3-none-any.whl
python库。资源全名:Trivial_Sudoku-2.0-py2-none-any.whl
Readers will discover how easy it is to implement and test non-trivial mathematical algorithms and will be guided through the many freely available add-on modules. A range of examples, relevant to ...
CaseStudy:PortingchardettoPython3documentsmy(ultimatelysuccessful)efforttoportanon-trivial libraryfromPython2toPython3.Itmayhelpyou;itmaynot.There’safairlysteeplearningcurve,since ...
非常简单的Python RESTful Web服务它只是一个100个LOC文件(请参阅 ),允许您通过@url_pattern装饰器以非常简单的方式创建RESTful Web服务。 它对于简单的项目,原型等可能很有用。 你为什么要使用它? 好吧,这...
To build this project, import it into Eclipse and use the Android SDK Plugin. I'll include Ant build files at some point in the future.
Trivial1a 琐碎程序的存储库。 软件架构课程 -,2014-15 作者
普通GDB(tgdb)是一个使用简单API制作GDB前端的库。 tgdb包含一个轻量级但功能齐全的curses前端,称为cgdb。
Auslander’s 1-Gorenstein代数上平凡的极大1-正交子范畴,黄兆泳,张孝金,设Λ是一个整体维数为2的Auslander’s 1-Gorenstein代数。如果mod Λ中有一个平凡的极大1-正交子范畴,则对mod Λ中的任意不可分解模M,M...
The aim is not to teach LATEX programming, but to give a quick reference to all the tips and tricks that can be used if you are encountering a (difficult) problem, or simply facing a question which ...
Android_Trivial:Android实用性
C++ Trivial Logger 是用 C++ 编写的轻量级记录器。 项目在 Boost License v. 1.0 下发布。
(trivial-formatter:fmt :your-system :supersede) 有关详细信息,请参见。 行宽。 默认值取决于实现。 (虽然可能是80。)您可以使用普通的lisp漂亮打印系统方式来控制它,即使用*PRINT-RIGHT-MARGIN* 。 ( let ...
Trivial2a 琐碎程序的存储库。 软件架构课程 -,2014-15======== 开发人员: | 姓 1 | 姓2 | 姓名 | 身份证 | Github 用户 | | ------------ | ------------------ | ------------------ ------ | ------- | -------...
琐碎的功能可确保在多个Common Lisp实现中保持一致的*FEATURES* 。 例如,在MacOS X平台上,大多数Lisps将:DARWIN推入*... 该规范由TRIVIAL-FEATURES系统实现,该系统支持少量Lisps。 实际上,该测试套件是使用的实
(ql:quickload :trivial-clipboard) 依存关系 CFFI(仅在Windows上) 用法 从剪贴板获取文本。 (trivial-clipboard:text) 将文字放入剪贴板。 (trivial-clipboard:text "put text!") 作者 佐野正敏( ) 项目 执照...
of work, but you will have to integrate them, and there is no question that a non-trivial site with individual requirements will also require a good deal of custom software. This is where this book ...
TrivialDB-一个简单的数据库引擎TrivialDB是一个简单的数据库管理系统,我们实现了大部分常见SQL语句和类型。同时支持多表连接,复杂表达式运算,多主键约束,外键约束,CHECK约束,UNIQUE和DEFAULT约束,聚集查询,...