`
yzjklove
  • 浏览: 62904 次
  • 性别: Icon_minigender_1
  • 来自: 广东省惠州市
社区版块
存档分类
最新评论

[Python Tips]去除 Trivial 赋值语句

阅读更多
[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_tools-1-py3-none-any.whl

    Python库 | Trivial_Sudoku-2.0-py2-none-any.whl

    python库。资源全名:Trivial_Sudoku-2.0-py2-none-any.whl

    Python for Scientists 第二版 2017

    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 ...

    Dive Into Python 3, r870 (2010).pdf

    CaseStudy:PortingchardettoPython3documentsmy(ultimatelysuccessful)efforttoportanon-trivial libraryfromPython2toPython3.Itmayhelpyou;itmaynot.There’safairlysteeplearningcurve,since ...

    trivial-python-web-services:一个方便的装饰器,用于在Python中创建非常简单的RESTful Web服务

    非常简单的Python RESTful Web服务它只是一个100个LOC文件(请参阅 ),允许您通过@url_pattern装饰器以非常简单的方式创建RESTful Web服务。 它对于简单的项目,原型等可能很有用。 你为什么要使用它? 好吧,这...

    Android代码-Trivial

    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:Trivial1a

    Trivial1a 琐碎程序的存储库。 软件架构课程 -,2014-15 作者

    trivial gdb-开源

    普通GDB(tgdb)是一个使用简单API制作GDB前端的库。 tgdb包含一个轻量级但功能齐全的curses前端,称为cgdb。

    Trivial Maximal 1-Orthogonal Subcategories For Auslander\

    Auslander’s 1-Gorenstein代数上平凡的极大1-正交子范畴,黄兆泳,张孝金,设Λ是一个整体维数为2的Auslander’s 1-Gorenstein代数。如果mod Λ中有一个平凡的极大1-正交子范畴,则对mod Λ中的任意不可分解模M,M...

    A-Practical-Guide-to-LATEX-Tips.pdf

    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实用性

    Android_Trivial:Android实用性

    C++ Trivial Logger-开源

    C++ Trivial Logger 是用 C++ 编写的轻量级记录器。 项目在 Boost License v. 1.0 下发布。

    trivial-formatter:常见Lisp的代码格式化程序

    (trivial-formatter:fmt :your-system :supersede) 有关详细信息,请参见。 行宽。 默认值取决于实现。 (虽然可能是80。)您可以使用普通的lisp漂亮打印系统方式来控制它,即使用*PRINT-RIGHT-MARGIN* 。 ( let ...

    Trivial2a:琐碎的2a

    Trivial2a 琐碎程序的存储库。 软件架构课程 -,2014-15======== 开发人员: | 姓 1 | 姓2 | 姓名 | 身份证 | Github 用户 | | ------------ | ------------------ | ------------------ ------ | ------- | -------...

    trivial-features:便携式CL

    琐碎的功能可确保在多个Common Lisp实现中保持一致的*FEATURES* 。 例如,在MacOS X平台上,大多数Lisps将:DARWIN推入*... 该规范由TRIVIAL-FEATURES系统实现,该系统支持少量Lisps。 实际上,该测试套件是使用的实

    trivial-clipboard

    (ql:quickload :trivial-clipboard) 依存关系 CFFI(仅在Windows上) 用法 从剪贴板获取文本。 (trivial-clipboard:text) 将文字放入剪贴板。 (trivial-clipboard:text "put text!") 作者 佐野正敏( ) 项目 执照...

    where code and content meet

    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:具有常见SQL查询支持的简单数据库引擎。 清华大学``数据库入门''课程的最终项目,2018年秋季

    TrivialDB-一个简单的数据库引擎TrivialDB是一个简单的数据库管理系统,我们实现了大部分常见SQL语句和类型。同时支持多表连接,复杂表达式运算,多主键约束,外键约束,CHECK约束,UNIQUE和DEFAULT约束,聚集查询,...

Global site tag (gtag.js) - Google Analytics