python __future__ package的几个特性

news/2025/2/24 14:56:16

我学习python过程, 和学习其它编程知识一样, 不是先读大部头书系统学习, 而是看博客和直接实践, 慢慢将这些知识点连成线, 再扩展到面. 这个过程缺点和优点都很明显. 缺点是, 有些知识点可能因为一直没有机会碰到, 就一直是盲点, 另外从点到面过程较长. 好在我自学能力很强, 基本碰到的问题都能搞得定.

近期研究github开源项目有几个发现, 代码多带有:

1. from __future__ import absolute_import
2. from __future__ import unicode_literals
3. 在根package的 __init__.py, 加上版本号和作者等信息,
__version__ = '0.0.2'  
__author__ = 'somebody'
4. 如果源码保存为utf-8格式, 文件头加上如下注释,   
# -*- coding: utf-8 -*- 


==============================
__future__的absolute_import
==============================
from __future__ import absolute_import, 字面理解好像是仅仅允许绝对引用, 其实不然, 真实意思是禁用 implicit relative import, 但并不会禁掉 explicit relative import.

举个例子, 目录结构如下,

src
    -my_app
        -__init__.py 
        -cake      
            |- __init__.py      
            |- icing.py      
            |- sponge.py   
        -drink      
            |- __init__.py      
            |- water.py      
 

要在 sponge.py 引用 icing , 有多种方法:
1. import icing # implicit relative import, py2已强烈不推荐使用, py3已经不可用了.
2. from . import icing # explicit relative import, python.org 官方不推荐.
3. from cake import icing # absolute import, python 官方推荐.

 

总结一下, 最好的做法应该是:
(1) 将 src 目录加到 PYTHONPATH 中
(2) 在 src 目录下家里一个 root package, 比如名称就叫 my_app
(3) import 时候都用 my_app.subpackage 或 my_app.module 这样绝对路径的写法,
比如 import my_app.module 或 from my_app import module




--------------------------
使用absolute_import, 常碰到的一个问题
--------------------------
使用__future__ absolute_import 之后, 常遇到的如下这一问题, 示例:   
-PackageA
 |- module1.py  
 |- module2.py  
 |- __init__.py  

module1.py 的代码示例:

from __future__ import absolute_impact  
from . import module2 #引入同包下的另一个module  
if __name__=="__main__":      
    print("module2 was imported in module1.")  

运行 module1.py 会报错, 报错信息: ValueError: Attempted relative import in non-package.
原因分析: from . import module2 这样的写法是显式相对引用, 这种引用方式只能用于 package 中, 而不能用于主模块中. 因为[主module]的name总是为 __main__, 并没有层次结构, 也就无从谈起相对引用了.
换句话, if __name__=="__main__": 和相对引用是不能并存的.

解决方法:
方法1: 在 module1 中使用绝对引用, 这个最简单了, 但相对引用的好处也没了.
方法2: 使用 python -m 来启动你的 module1.py, 这个也不推荐.
方法3(推荐): 在 module1 中, 加个main()函数, 然后再新建一个 PackageA/entry.py 做为主程序, 在 entry.py 中使用绝对引用来导入 module1 , 并调用 module1.main(), 这一办法虽不完美, 但我觉得是最好的方法了.


==============================
unicode_literals
==============================
from __future__ import unicode_literals 在python 2.x中, 对于字符串, 默认还不是采用 unicode 编码的, 除非在字符串前加上前缀u. 比如:

>>>x='中国'  
>>>x  
'\xd6\xd0\xb9\xfa'  
>>>print(x)  
中国  
>>>
>>>x=u'中国'  
>>>x  
u'\u4e2d\u56fd'  
>>>print(x)  
中国  

在python3中默认的编码采用了unicode, 并取消了前缀u. 如果代码要兼容python2/3, 就很麻烦了.

通常有如下3种做法, 其中前两个做法都不推荐:
1. 不管是汉字还是英文, 字符串前面统一不加u. 这种处理方式多数情况下没有问题, 比如print输出, 但字符串如果需要做encode/decode, 就很麻烦.
2. 加python版本判断, 如果 sys.version >3 的话, 字符串不加前缀u, 如果是py2, 加上前缀u. 可以想象, 业务逻辑中再加上这样的判断, 代码会变得很难看.
3. 现在有第3种, 即引入unicode_literals, from __future__ import unicode_literals, 这样在py2下, '中国'这样的字符串不用家前缀u, 也是unicode编码.


==============================
引申阅读
==============================
http://blog.ludovf.net/python-str-unicode/
http://blogs.skicelab.com/maurizio/unicode-common-pitfalls.html

转载于:https://www.cnblogs.com/harrychinese/p/python_future_package.html


http://www.niftyadmin.cn/n/3855195.html

相关文章

(二) java版电子商务spring cloud分布式微服务b2b2c社交电商-Spring Boot配置文件详解...

Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六。springboot采纳了建立生产就绪Spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能够让spri…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误,找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

2012年最经典的Hyper-V精品文章60篇

Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术。这也意味着微软会更加直接地与市场先行者VMware展开竞争。本电子书为大家整理了2012年最经典的 Hyper-V 博文60篇,分享给大家。 …

交付编译后代码的巨大好处

2019独角兽企业重金招聘Python工程师标准>>> 最近因为要交付产品, 并且是编译后产品, 用license进行控制, 不得不对代码进行测试,再测试, 因为交付后,重新release, 重新测试, 重新部署都是很麻烦的事情.不过确确实实体会到其中的好处: 1: 对于客户严格的控制和管理…

早餐应该在几点吃比较好以及一下生活技巧

【早餐应该在几点吃比较好】一旦吃早餐太早,势必会干扰胃肠休息,使消化系统长期处于疲劳应战的状态,扰乱肠胃的蠕动节奏。所以能在7点左右起床后20至30分钟吃早餐最合适。另外,早餐与中餐以间隔4至5小时左右为好,也说明…

PHP+socket游戏数据统计平台发包接包类库

<?php /*** title: PHPsocket游戏数据统计平台发包接包类库* version: 1.0* author: perry <perry1kyou.com>* published: 2013-05-2*/class TPkgxmk{var $socket; var $connection; var $IP; var $Port; var $bu…

EUI——专为Lua程序员设计的软件开发平台,制作漂亮的界面从此轻松

EUI是一款基于DirectUI技术的界面开发工具&#xff0c;目前仅开放了Lua编程接口。使用简单的Lua语言&#xff0c;就可以开发软件了。同时EUI自有所见即所得编辑器&#xff0c;界面拖拖放放摆出来&#xff0c;无须写代码。在上周发布了第一个公开版之后&#xff0c;根据各位网友…

postgre alter命令修改字段

参考文档&#xff1a;https://www.yiibai.com/postgresql/postgresql_alter_command.html PostgreSQL ALTER TABLE命令用于添加&#xff0c;删除或修改现有表中的列。您还可以使用ALTER TABLE命令在现有表上添加和删除各种约束。 语法&#xff1a;使用ALTER TABLE语句在现有表中…