python __future__ package的几个特性
我学习python过程, 和学习其它编程知识一样, 不是先读大部头书系统学习, 而是看博客和直接实践, 慢慢将这些知识点连成线, 再扩展到面. 这个过程缺点和优点都很明显. 缺点是, 有些知识点可能因为一直没有机会碰到, 就一直是盲点, 另外从点到面过程较长. 好在我自学能力很强, 基本碰到的问题都能搞得定.
近期研究github开源项目有几个发现, 代码多带有:
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
python __future__ package的几个特性的更多相关文章
- [Centos] mod_wsgi 安装流程以及遇到问题解决办法。apxs: command not found 或 Sorry, Python developer package does not appear to be installed.
前提: Centos 系统, apache 已安装, python 已安装. 1. 首先下载mod_wsgi-3.5.tar.gz 下载地址:https://code.google.com/p/mod ...
- Python进阶:全面解读高级特性之切片!
导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python __future__ 的几种特性
今天看tensorflow的代码,看到python里面有这么几句: from __future__ import absolute_import from __future__ import divi ...
- python __future__ 使用
在开头加上from __future__ import print_function这句之后,即使在python2.X,使用print就得像python3.X那样加括号使用.python2.X中pri ...
- Sublime Text 3 python和Package Control配置方法
(如果下面的方法试了Packages control功能还是不能用参考这个方法: 1.直接把C:\Sublime Text 3x64\Data\Packages\ 目录下原有的Packages c ...
- 个人Python常用Package及其安装
为了避免每次重装系统时又要东翻西找,现在此记录一下目前常用的Python包安装过程. 1) Python: 2.7.11, 下载地址:www.python.org.由于个人喜欢使用PyQt4(其实是不 ...
- 深入理解python之一——python3对象的一些特性
文章使用markdown写的,编辑的时候行间距还可以,显示的时候行间距好小,我也没办法. 首先,需要明白的是python是一种解释性语言标准,他可以由c.java或者其他语言来实现.在python的标 ...
随机推荐
- NuGet包引用依赖问题
如A包需要引用B包,然后在项目中安装A包时,自动把B包也装上. 在nuget命令行打包的时候,如果是指定项目的csproj文件进行打包的,都只能打包当前项目的dll,那么如果使用了第三方的dll而没有 ...
- array数组加过滤
var array = new Array(); array.push(0); array.push(1); array.push(2); var arr = array.filter(functio ...
- [Android]Volley的使用
Volley是Google I/O 2013上提出来的为Android提供简单快速网络访问的项目.Volley特别适合数据量不大但是通信频繁的场景. 优势 相比其他网络载入类库,Volley 的优势官 ...
- CloseHandle(IntPtr handle)抛异常
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static ext ...
- BZOJ1047: [HAOI2007]理想的正方形
传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...
- Android应用内语言切换实现(转)
使用Java反射机制 IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法. 第一步.使用Android开放的api更改Confi ...
- StringBuilder 和 StringBuffer
这两者唯一的不同就在于,StringBuffer是线程安全的,而StringBuilder不是.当然线程安全是有成本的,影响性能,而字符串对象及操作,大部分情况下,没有线程安全的问题,适合使用Stri ...
- context.Request.Files为NULL问题 在实现图片上传功能的时候出现在ashx等处理页面出现context.Request.Files为NULL异常,有几点需要注意:
.在客户端可以将form用submit提交,如下: <%@ Page Language="C#" AutoEventWireup="true" CodeF ...
- mysqli连接数据库的模板
<?php $host="localhost"; $db_user="root"; //数据库用户 $db_pass=""; //数据 ...
- 60行JavaScript俄罗斯方块
<!doctype html><html><head></head><body> <div id="box" st ...