标签 思考 下的文章

关于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版本下测试通过。

说说工作幸福感

职场上的朋友可能经历过以下两种截然不同的状态:

(一)
每天早晨起来都有一种强烈要上班工作的冲动;
一到公司,立即感觉精力充沛,并希望尽快开始做事,不能浪费一分一秒;
每天下班前回顾一天的工作时,都能感觉到收获和进步,并带着笑容下班;
每天回到家里,暂时忘记工作,与家人共度良霄,养足精力;
生活与工作保持一定距离,这始终让你与工作之间有美的感觉。

(二)
每天早晨一想到要上班,就愁云遮面,总想在床上多睡一会,拖延上班时间;
一到公司,就精神萎靡,思维闭塞,浑浑噩噩;
每天下班前回顾一天的工作时,毫无感觉,只是感觉忙乱中时间就流逝了;
回到家里,却仍被工作压力驱使,埋头伏案,远离家人;
生活和工作如稀泥一样搅和在一起,工作让你感到恐惧。

千万不要觉得以上内容是我杜撰出来的,这是真切发生在你我身边的事实。同样是在工作,状态却为何能有如此天壤之别呢?不同的人给出的答案也许不同,而这里我要说工作幸福感使然:前者显然是工作幸福感富足的结果;而后者则是缺乏工作幸福感在作祟。

俗话说“乐也一天,烦也一天”,每个人都希望自己每天都能快乐的活着。如果你目前正处于第二种状态或者说有向第二种状态转移的迹象,那是时候考虑如何调整一下自己了。恰逢新年伊始,这里我来说说如何提升工作幸福感,做一个善于驾驭工作的人,而不是被工作牵着鼻子走的人。

以下观点来自本人亲身体会,不一定完全正确,仅供参考和讨论。

* 选择可以产生幸福感的工作

世上没有绝对地无法产生幸福感的工作,但对于大多数平常人来说,一些种类的工作的确无法带来幸福感,比如富士康生产线上的零件组装工种,实难想像在那种岗 位上如何产生幸福感,因此跳楼事件频发也就不足为奇了。我无法枚举出所有可以产生幸福感的工作种类,但至少程序员这份工作还是具备产生幸福感的属性的。虽 然我们中国程序员总是习惯自嘲地称自己为“码农”,可“码农”也有收获的幸福时刻啊。程序员这份工作还是需要有创造性的,主观因素对结果的影响比例还是蛮 大的;编码也被认为是一种匠艺,这说明其中有一定艺术的成分。有艺术,就会有美丑的评判。追求和收获美的代码是会让人感觉到幸福的。不过这个世界是现实和 残酷的,为了生存而选择了那些幸福感无几的工作是十分普遍的,当然这种社会问题不是本文所能解决的了的。

* 做自己愿意做的事情

在中国,公务员这种工作想必大家都会认为会产生幸福感。传统印象中,公务员是广义的“官”的现代叫法,而老百姓大脑中的“官”的形象无非是坐在办公室里抽 烟、喝茶、看报纸,这确是一份旱涝保收的工作,但坐在办公室无聊地度此一生是否是你真正愿意去做的事情呢?这只是一个生动的例子罢了,我要说明的是即便是 从事着可以产生幸福感的工作,也不见得就会有工作幸福感,还要看这个事情是否是你真的愿意去做的,是否真的是你感兴趣去做的,是否是真正全心投入去做的。 微观上来看,即便从事了愿意去做的工作,但涉及到具体的事情,也会有好恶之分。以程序员这个职业为例,也分为不同角色,你是愿意做Coding还是愿意做 tech manager;你是愿意做产品还是愿意做项目?时刻记住只有做自己愿意做的事情,幸福感才能眷顾到你。Steve Jobs的一句话教育了我们:“跟随你的内心”。

* 明确的工作目标

很多人在工作当中时常感觉空虚和迷茫,这显然会降低工作幸福感。反思一下这种感觉究竟来自什么?就我个人的体会来说,每当工作目标不明确时,我就会有这类 感觉。反之,明确的目标犹如大海上的灯塔,为你指明前进的方向;让你有的放矢;让你的付出充满了确定性,让你对预期更加有信心,它会让你的心中由衷产生一 种愉悦。

* 工作成果有及时反馈

就如小学生第二天看到作业本上老师的评语那样,我们也希望能尽快看到工作成果的反馈:正面的反馈给人以鼓舞;负面的反馈给人以警醒。反之,零反馈则让人气馁,失去了继续的动力,自然没有幸福感可言。

* 挑战带来幸福感的波峰

在职场中,每天的情形不同,收获不同,体味到的工作幸福感的强弱就有不同。俗话说:有付出就有收获。付出的越多,一旦收获,得到的也就越多。因此只有那些有挑战的,值得让你付出更多的工作才能带来巨大的成就感,从而催生出幸福感的波峰。

* 帮助他人解决工作中的问题

“予人玫瑰,手有余香”,积极地帮助他人解决工作中的问题,会让你的工作幸福感油然而生。让你的工作幸福感弥漫在工作的环境当中,让这种氛围感染熏陶更多的人,以营造一个幸福的工作氛围,提升团队的整体工作幸福感。

* 与志同道合的人一起工作

看看你周围的同事,是否和你是一路人。“道不同不相为谋”,别花时间和心思在那些和你不对路的人的身上了,年纪也不小了,脑细胞也是有限的,吐沫星子也不 是白来的。那些通过一个眼神、一个手势就能知你意的人才是你真正的工作伙伴,和他们一起工作才能有幸福感。能选就选,能避就避吧。

* 定期回顾,潜意识中进行自我肯定

无论是否得到了上级或同事的反馈,定期的工作回顾和总结对保持工作幸福感总是大有裨益的,尤其是回顾过程在潜意识中的自我肯定会很大程度上提升你的工作幸福感。

* 与幸福生活相互映衬

中国人讲:“家和万事兴”。工作之外我们是离不开家庭生活的。我们要学会平衡,把握生活与工作的间距,学会让两者之间互相保持美感。幸福的工作下映衬的是幸福的生活,反之,在幸福生活的的映照下,工作幸福感也会显得更加强烈。工作和生活是相辅相成。

演喜剧的,不见得他每天的生活都是喜剧。最近感觉工作幸福感有所流失,这直接促使了我进行了如上的反思。新年伊始,我也在自我调整中。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! 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