[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 的追求。
分享到:
相关推荐
在给定的资源“trivial_tools-1-py3-none-any.whl”中,我们看到这是一个针对Python开发者的库,名为“trivial_tools”。这个库的版本号为1,兼容Python 3解释器,并且适用于任何操作系统和架构。 Python的.whl文件...
在Python环境中,只需使用`pip install Trivial_Sudoku-2.0-py2-none-any.whl` 命令即可完成库的安装。 在实际应用中,`Trivial_Sudoku` 库可能包含以下功能: 1. **生成数独**:库可能提供了生成随机数独谜题的...
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 ...
在IT行业中,网络配置管理是一项重要的任务,而TFTP(Trivial File Transfer Protocol)和SNMP(Simple Network Management Protocol)是两种常用的工具。本篇文章将深入探讨如何利用Python实现TFTP来通过SNMPset...
标题中的“Python库 | tap-zendesk-0.1.0.tar.gz”表明这是一个与Python相关的库,名为“tap-zendesk”,版本为0.1.0,且以tar.gz格式压缩。这种格式通常用于在Unix-like系统或Python环境中分发源代码。描述中的...
`tap-postgres`是一个Python适配器,遵循TAP(Trivial Application Programming)规范,使得与PostgreSQL数据库的交互变得简单易行。TAP规范是一个轻量级的接口标准,旨在简化不同应用之间的数据传输。在Python中,`...
### Python网络编程知识点详解 #### 一、网络概述与UDP通信 ##### 1.1 网络概述 - **定义**: 网络是一种工具,用于连接多方,使之能够进行数据交换。 - **目的**: 实现不同计算机之间的数据传递。 - **应用场景**:...
PyPXE的源代码包含了一个完整的DHCP(Dynamic Host Configuration Protocol)服务器和一个TFTP(Trivial File Transfer Protocol)服务器,这两者是PXE网络引导过程中的关键组件。 1. DHCP服务: DHCP是网络自动...
在本文中,我们将探讨如何使用Python3的Socket库实现一个简单的TFTP(Trivial File Transfer Protocol)文件上传功能。TFTP是一种轻量级的文件传输协议,常用于网络设备配置和操作系统初始化等场景。 首先,确保你...
非常简单的Python RESTful Web服务它只是一个100个LOC文件(请参阅 ),允许您通过@url_pattern装饰器以非常简单的方式创建RESTful Web服务。 它对于简单的项目,原型等可能很有用。 你为什么要使用它? 好吧,这...
基于Python的广电宽带业务系统自动化运维是现代广电网络运营的重要组成部分,尤其在Java程序开发和软件开发领域中,这种自动化运维已经成为提升效率和保障服务质量的关键。本文主要讨论了广电宽带业务系统的基本构成...
在这个示例中,我们看到如何使用socket来实现一个简单的TFTP(Trivial File Transfer Protocol)客户端,用于从服务器下载文件。 TFTP是一种轻量级的文件传输协议,主要用于那些对资源有限或简单配置的设备。它基于...
`trivial gdb`,简称为`tgdb`,是一个开源项目,旨在提供一个简单易用的API,用于构建GDB(GNU调试器)的前端应用。GDB是GNU项目的一部分,是一个强大的源代码级调试器,支持多种编程语言,如C、C++、Fortran等。`...
在本文中,我们将深入探讨Python3中的TFTP(Trivial File Transfer Protocol)文件传输协议的实现。TFTP是一种简单的文件传输协议,常用于网络设备配置和操作系统映像的更新,因为它易于实现且需要的资源较少。 ...
【标题】"Trivial1a:Trivial1a" 是一个看似简单的项目名称,它可能是一个初学者项目或者用于教学目的。这个项目的核心是“琐碎程序”,这通常指的是小型的、基础的编程任务,旨在帮助学习者理解编程概念或特定技术。...
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.