[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 的追求。

[Python Tips]去除 Trivial 赋值语句相关推荐

  1. python脚本去除文件名里的空格

    原始文件名里很多空格,写了个python脚本去除文件名里的空格 import osfilepath="image" # 文件目录名 zimulus = os.listdir(fil ...

  2. 在python中正确的赋值语句为3y=x+1-在 Python 中,正确的赋值语句为 ( ) 。_学小易找答案...

    [填空题]和x/=x*y+z等价的语句是 . [单选题]语句print("x=${:7.2f}".format(123.5678))执行后的输出结果是( ).选项中的 □代表空格. ...

  3. Python OpenCV去除图片水印

    问题描述 去除百度水印 1.jpg,背景简单 2.jpg,背景复杂 解决方案 安装 pip install opencv-python pip install numpy 方法一.OpenCV提取颜色 ...

  4. 教你一招利用Python快速去除图片水印

    大家好,我是IT界搬运工. 相信大家都有在网上下载好图片但是有水印的烦恼,那么问题就来了:看到心爱的图片想要"占为己有".怎么把图片上的水印去除呢?今天我就来教你一招利用Pytho ...

  5. python字符串去除头尾_python 如何去除字符串头尾的多余符号

    在读文件时常常得到一些\n和引号之类的符号,可以使用字符串的成员函数strip()来去除. 1.去除首尾不需要的字符 a= '"This is test string"' # st ...

  6. 译(二十六)-Python怎么去除末尾的换行符?

    文章首发及后续更新:https://mwhls.top/2935.html 新的更新内容请到mwhls.top查看. 无图/无目录/格式错误/更多相关请到上方的文章首发页面查看. stackoverf ...

  7. 用python一键去除图片、PDF水印

    嗨嗨,我是小圆,现在网络上的图片大多都有水印,我们每次找无水印的图片都有点难找. 但今天给大家分享一下 : 如何用python一键去除图片.PDF水印 看完学会后就不用担心 水印会影响阅读了 安装模块 ...

  8. 用逗号分割并在Python中去除空格

    本文翻译自:Split by comma and strip whitespace in Python I have some python code that splits on comma, bu ...

  9. python 字符串去除转义

    python 字符串去除转义 字符串中有"\u0000",写入EXL是会报错"openpyxl.utils.exceptions.IllegalCharacterErro ...

最新文章

  1. python小游戏代码大全-python小游戏实现代码
  2. 我的第一个Windows Phone 7应用程序
  3. React-Native学习指南
  4. python 视频转场_视频剪辑什么鬼?Python 带你高效创作短视频
  5. 怎么修改存储路径_Power Query数据位置变了?利用参数轻松解决源文件路径问题...
  6. * Dijkstra 堆优化
  7. spring2.X(1)--新特性介绍
  8. javaScript书写规范
  9. C# 如何 保存对config文件的修改
  10. 端口截听实现端口隐藏 嗅探与攻击
  11. 网络安全联盟推进威胁情报共享的扩张
  12. Android基础知识总结
  13. 预设Date时间格式化参数
  14. 思科arp欺骗攻击,cdp攻击,DHCP攻击实验命令笔记
  15. 2018服务商口碑榜Top50(4月)重磅出炉
  16. 15直接引语变间接引语(陈述句作宾语从句)
  17. 一款好用的设计师导航,让设计师拥有良好的设计体验
  18. 2018年Oracle官网下载Oracle 11g安装包
  19. 基于STC51:四轴飞控开源项目原理图与源码(入门级DIY)
  20. LWIP-TCP Server连接两次之后无法连接问题

热门文章

  1. 基本的二进制加法器(计算机组成原理)
  2. 【证明】相似矩阵的特征值相同
  3. matlab 的 regress、 nlinfit 、stepwise函数多元回归分析
  4. 微信公众平台自带的生成公众号二维码的连接
  5. 关于TrueType字体结构的文章
  6. Android之 设备的超级管理员与一键锁屏之原理
  7. [日常] NOIWC 2018爆零记
  8. 关于int*p=a与int*p;p=a的解惑
  9. Celeb数据集的介绍和使用
  10. pon(无源光纤网络)