标签 Python 下的文章

谋划2013

眼看2013年已经过去1/6了,这个谋划显然有些晚了。之所以晚,根本原因还是之前有些很多事情没有想清楚,即便是现在可能依旧比较朦胧。鉴于去年的目标执行情况不甚理想,尤其是工作目标方面,因此今年在谋划策略方面变得更加务实和收敛,期望能说到做到或做的尽可能的多。

一、个人目标

* 鉴于去年的执行情况,今年将blog定在80篇(大约每5天一篇)应该问题不大,毕竟blog已经成为我生活的一个重要组成部分了。

* 阅读是必不可少的。今年计划将读书目标定在40本(大约每9天一本)。去年的读书效率下降许多,感觉更多是因为自己变得懒散了。所以今年除了“扫库存”之外,还增加了一个改善措施:从省图书馆借书读。俗话说:书非借而不能读也^_^。借书读,一方面降低书架上的书增长的速度,减少了开支;另一方面还可能提高读书效率,借的书毕竟是要还的么^_^。昨天在整理果果的书时发现我的书架已经接近满员了,所以以后非经典书/非紧急书就不打算买了,不知道能否借此戒掉“买书瘾”,想必到时侯还是会纠结一番的^_^。最后在读书方面还是要给自己设置一条主线的,尽量围绕自己的目标达成去选择读哪些而不读哪些,读自己所需要的,按照自己的思路去读,千万不要人读己亦读。

* 学习新编程语言方面。每年一门新语言,但今年目标不甚明确。对函数式语言有些担心,前途似乎没有看起来的那么美,可预见到情况是将长期持续在小众领域徘徊。今年的策略是看缘份了^_^。在日常工作中,Python这门语言的使用是愈来愈多了,今年在Python方面肯定是要继续深入研究一点点的。

* 开源方面。我将继续和同事一起推进buildc的演进,至少会完成已经策划已久的0.3.0版本的设计与实现。在开源方面目前尚未参与过其他人发起的项目,这块更多还是自己找点子,期望今年能有一些新的想法。

* 个人健康方面。前些日子得了肺部感染,连续挂了近两周点滴才控制住病情,钱没少花,罪没少遭,还好目前看起来像是痊愈了。恰因为此,今年才把这个单独拿出来作为个人目标的一部分。事后分析,之所以被细菌感染,更多是因为自己的免疫力太低了。事实上也是这样的:去年一整年都没有什么锻炼身体的活动,免疫力不低就怪了。所以今年打算把晨跑提上日程,记得11年是晨跑坚持时间最长的一年,每天跑上3km,各方面的感觉的确是非常好的。

* 关注代码。和2012相比,今年期望能抽出更多的时间和精力编写自己的代码、阅读和评审其他人的代码。对于程序员出身的我而言,代码的魔力是我无论如何都无法抗拒的。

* 其他能力提升方面。今年重点想提升一下当众Speaking能力。目前当众讲话是没啥问题的,但如何当众把话讲的更好更具吸引力,这方面还需要专门的学习和训练。

二、工作目标

不得不承认去年工作方面的失意让我对工作的热情有所衰退,所以今年在工作目标方面尽量收敛一些,也不想在这里把一些具体目标展开说明了,唯一所求的就是踏踏实实把重点任务做好。另外任何事情做久了,都想期待有一些变化。

三、家庭目标

虽然去年的家庭目标完成的十分不错,不过有了去年的家庭目标做铺垫,今年的目标达成难度加大了许多,压力山大啊。这里先列出一些简单的:

* 更新数码装备:本本、手机、相机、平板、电纸书等。
* 给果果转到规模较大的幼儿园,接受更为规范的教育。
* 常回父母家看看。
* 家庭成员省内、国内、境外游至少各一次。
…. 这里省略很多更难实现的家庭目标。

与工作相比,感觉我在家庭生活上的掌控力更弱一些,让我纠结的事情也更多一些。至于原因么,男人都懂的。

总体来说,至少从这篇blog的篇幅上来看,2013的目标比2012年要收敛许多,尤其在工作方面。有些事情等做完了再说也未尝不好。 

关于Python Package下的Module import方式

2012年有一个目标我没有达成,那就是深入学习和使用Python语言。这个目标被其他学习任务和工作无情的抢占了,当然最主要的原因还是我重视不够^_^。

近期恰逢有一些Python工程的开发工作要做,就顺便略微深入地学习了一下Python:看了几本Python的英文大部头,比如《Learning Python 4th Edition》、《Python Essential Reference 4th Edition》、《Programming Python 4th Edition》、《Expert Python Programming》以及《The Python standard library by example》,看得我有些要吐了^_^。虽然之前用Python开发过buildc,但自我感觉依旧还是一个Python的绝对beginner,这 次通过这几本书的学习算是对Python有了个较为系统的了解了。

言归正传,今天要探讨的是一个有关Python Package下的Module import的问题,这是我在进行一个Python工程源码组织设计时遇到的。一般来说,我们的工程代码组织形式如下:

py-proj/
    main.py
    pkg1/
        __init__.py
        mod1.py
    pkg2/
        __init__.py
        mod2.py
    test/
        __init__.py
        testmod1.py
        testmod2.py

工程的dev需求如下:

* 执行main.py(其中import了各个pkg的module)
* 能够单独执行pkg下的某个module
* 兄弟pkg间可以相互import module
* 能够单独执行test下的某个module的test用例
* 能够一次执行test下的所有module的test用例

基于工程的这些dev需求,我们来看一下module import方式的选择。

Python自2.5版本之后支持两种package import方式:absolute import和relative import。不过Guido van RossumPEP 8中明确建议采用absolute import,理由是:more portable和more readable。经过试验,我个人觉得Guido van Rossum的建议是十分中肯的。relative import在不同版本间的支持语义有差别,且在理解方面显得有些复杂。《Learning Python 4th Edition》中花了将近一个小节来讲Package relative import,感觉复杂难懂。虽然relative import能解决一些问题,但感觉投入产出比不高。我们来看看package absolute import能否满足我们的所有工程dev需求。

* 执行main.py

无论当前工作目录(current working directory)是哪个目录,一旦执行main.py,Python就会自动将main.py所在的目录添加到sys.path中去,作为一个 module search path的entry。这样只要工程下的文件都采用了absolute import,Python就可以正确找到并import正确的module。

* 单独执行某pkg下的某个module

我们在dev时有这样的需求:单独执行某个正在编写的module的代码以获得一些执行结果的反馈。不过,以上面例子中的代码结构为例,如果我们进入到 pkg1目录下执行python mod1.py,一旦mod1.py引用了pkg2.mod2,你就会收到如下错误(前提是你使用了absolute import):

$ python mod1.py

Traceback (most recent call last):
  File "mod1.py", line 2, in <module>
    import pkg2.mod2
ImportError: No module named pkg2.mod2

因为Python只是将pkg1这个路径加入到module search path中了,这个路径下显然没有pkg2/mod2.py。不过我们可以通过在工程top-level路径下执行"python -m pkg1.mod1"来单独执行mod1的代码,这样absolute import依然生效,不会导致import error。

* 兄弟pkg间可以相互import module

这个与上面的执行方法类似,只要在top-level下通过python -m执行,那么无论pkg层次多深,无论有多少兄弟package,Python总是可以找到正确的module并导入。

* 单独执行test下的某个module的test用例

这有些类似于引用兄弟package的情况。我们通过在顶层路径下执行python -m test.testmod1即可达到此目的。

* 一次执行test下的所有module的test用例

较新的Python版本已经可以自动发现测试用例并执行。我们通过在top-level目录执行python -m unittest discover test即可执行test目录下所有符合unittest包约定要求的单元测试用例文件。在执行这个命令时,Python会将top-level路径以及 test路径都加入到module search path中。

终上,Absolute import可以满足所有需求。虽然有时候absolute import从代码上会看起来有些冗长(通过from … import …能有所缓解),但在语义理解的简单性和可读性上的优势让我更加倾向于这种方式。另外通常情况下我们是无需重新设置PYTHONPATH,也用不 到.pth文件,更不需在代码里修改sys.path来改变Python的module search path的。

注:以上测试均在Ubuntu 12.04 LTS Python 2.7.3版本下测试通过。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats