[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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值