专栏首页python3python 基础知识汇总(注释规范)

python 基础知识汇总(注释规范)

1.python的注释规范

python 分为 单行注释,多行注释以及特殊注释

特殊注释:

#!/usr/bin/env python
# -*-coding:utf-8-*-

例1:#!/usr/bin/env python

1、必须是文件的第一行

2、必须以#!开头

 3、告诉LINUX/UNIX去找到python的翻译器。

例2:#-*-coding:utf-8-*-  :

1、基本上在文件的第二行,在#!/usr/bin/env python的下一行

2、python interpret如何解释字符串的编码

3、当你的文件中出现中文的时候,你必须使用它

多行注释:"""....."""

"""
多行注释  
"""
'''
多行注释
'''

  一般用于给类文档,函数文档作注释,可以是三个单引号也可以是双引号。

单行注释 #

# 单行注释

如何查看本地python的documentation:出处 

ChasingdreamLY

打开cmd然后输入:python -m pydoc -p 1234

给大家解释一下命令含义: 

python -m pydoc表示打开pydoc模块,这个模块就是用来查看python文档的工具

-p 1234表示在端口号1234上打开server,这个端口号可以自行设置

打开的网页documentation如下图,根据需要查看相关module/packages/等信息。

python 调试

1.设置断点,红色的点

2.调试断点,按 绿色甲壳虫标志,就会运行到断点处(第二图),可以在二图的下方看到变量的变化。按F8 步进。

python中的import:出处 刘畅

"""
目录结构如下:
├── __init__.py
├── main.py
└── string.py
"""
# main.py 内容如下
import string
print string.a
# string.py 内容如下
a = 2
  1. 当我们执行main.py的时候,会发生什么事情?
  2. 在main.py文件执行到 import string 的时候,解释器导入的string类库是当前文件夹下的string.py还是系统标准库的string.py呢?
  3. 如果明确的指明⾃己要引⼊的类库?

Python的两种引入机制

Python 提供了二种引入机制:

  1. relative import
  2. absolute import

relative import

relative import 也叫作相对引入,在Python2.5及之前是默认的引入方法。它的使用方法如下:

from .string import a
from ..string import a
from ...string import a

这种引入方式使用一个点号来标识引入类库的精确位置。与linux的相对路径表示相似,一个点表示当前目录,每多一个点号则代表向上一层目录。

absolute import

针对如下语句:

"""
├── __init__.py
├── foo.py
└── main.py
"""
# foo.py
a = 2
# main.py
print __name__
from .foo import a
print a

absolute import 也叫作完全引入,非常类似于Java的引入进制,在Python2.5被完全实现,但是是需要通过 from __future__ import absolute_import 来打开该引入进制。在Python2.6之后以及Python3,完全引用成为Python的默认的引入机制。它的使用方法如下:

from pkg import foo
from pkg.moduleA import foo

要注意的是,需要从包目录最顶层目录依次写下,而不能从中间开始。

Python import实现

Python 提供了 import 语句来实现类库的引用,下面我们详细介绍当执行了 import 语句的时候,内部究竟做了些什么事情。

当我们执行一行  from package import module as mymodule 命令时,Python解释器会查找package这个包的module模块,并将该模块作为mymodule引入到当前的工作空间。所以import语句主要是做了二件事:

  1. 查找相应的module
  2. 加载module到local namespace

下面我们详细了解python是如何查找模块的。

查找module的过程

在import的第一个阶段,主要是完成了查找要引入模块的功能,这个查找的过程如下:

  1. 检查 sys.modules (保存了之前import的类库的缓存),如果module被找到,则到第二步。
  2. 检查 sys.meta_path。meta_path 是一个 list,里面保存着一些 finder 对象,如果找到该module的话,就会返回一个finder对象。
  3. 检查这些隐式的finder对象,不同的python实现有不同的隐式finder,但是都会有 sys.path_hooks, sys.path_importer_cache 以及sys.path。
  4. 抛出 ImportError。

sys.modules

对于第一步中sys.modules,我们可以打开Python来实际的查看一下其内容:

Python 2.7.10 (default, Aug 22 2015, 20:33:39)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>> import sys
>> sys.modules
{'copy_reg': <module 'copy_reg' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.pyc'>, 'sre_compile': <module 'sre_compile' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_compile.pyc'>,...}
>> sys.modules['zlib'].__file__
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/zlib.so'

可以看到sys.modules已经保存了一些包的信息,由这些信息,我们就可以直接知道要查找的包的位置等信息.

finder、loader和importer

在上文中,我们提到了sys.meta_path中保证了一些finder对象。在python中,不仅定义了finder的概念,还定义了loader和importor的概念。

  • finder的任务是决定自己是否根据名字找到相应的模块,在py2中,finder对象必须实现find_module()方法,在py3中必须要实现find_module()或者find_loader()方法。如果finder可以查找到模块,则会返回一个loader对象(在py3.4中,修改为返回一个module specs)。
  • loader则是负责加载模块,它必须实现一个load_module()的方法。
  • importer 则指一个对象,实现了finder和loader的方法。因为Python是duck type,只要实现了方法,就可以认为是该类。

sys.meta_path

在Python查找的时候,如果在sys.modules没有查找到,就会依次调用sys.meta_path中的finder对象。默认的情况下,sys.meta_path是一个空列表,并没有任何finder对象。

In [6]: sys.meta_path
Out[6]: []

我们可以向sys.meta_path中添加一些定义的finder,来实现对Python加载模块的修改。比如下例,我们实现了一个会将每次加载包的信息打印出来的finder。

from __future__ import print_function
import sys


class Watcher(object):
    @classmethod
    def find_module(cls, name, path, target=None):
        print("Importing", name, path, target)
        return None


sys.meta_path.insert(0, Watcher)

import socket

当我们执行的时候,就可以看到系统加载socket包时所发生的事情。

liuchang@localhost  ~/Codes/pycon/ex5_meta_path
 $ python finder1.py
 Importing socket None None
 Importing _socket None None
 Importing functools None None
 Importing _functools None None
 Importing _ssl None None
 Importing cStringIO None None

sys.path hook

Python import的hook分为二类,一类是上一章节已经描述的meta hook,另一类是 path hook。

当处理sys.path(或者package.path)时,就会调用对应的一部分的 Pack hook。Path Hook是通过向sys.path_hooks 中添加一个importer生成器来注册的。

sys.path_hooks 是由可被调用的对象组成,它会顺序的检查以决定他们是否可以处理给定的sys.path的一项。每个对象会使用sys.path项的路径来作为参数被调用。如果它不能处理该路径,就必须抛出ImportError,如果可以,则会返回一个importer对象。之后,不会再尝试其它的sys.path_hooks对象,即使前一个importer出错了。

在参考文献刘畅 中还有关于import的扩展,但又需要时再扩展。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python request 发送for

    py3study
  • python sys模块

    ['E:\\python_script\\day5\\test4', 'C:\\Program Files\\Python36\\python36.zip', ...

    py3study
  • python中的setdefaulten

    http://blog.csdn.net/magicharvey/article/details/20055949

    py3study
  • python sys.path.append()和sys.path.insert()

    python程序中使用 import XXX 时,python解析器会在当前目录、已安装和第三方模块中搜索 xxx,如果都搜索不到就会报错。 使用sys.p...

    周小董
  • python request 发送for

    py3study
  • 快速查找Python安装路径方法

    (adsbygoogle = window.adsbygoogle || []).push({});

    双面人
  • python实现Tab自动补全功能

    {大神请忽略} ? 默认情况下python命令行下是不支持命令补全功能的,用的时候总是得百度,所以索性在博客简单记录一下,方便下次使用. 一、创建tab....

    行 者
  • 一日一技:导入父文件夹中的模块并读取当前文件夹内的资源

    在编写 GNE 的测试用例时,有一个脚本 generate_new_cases.py放在 tests文件夹中。而 tests 文件夹与 gne 文件夹放在同一个...

    青南
  • python中的import,reloa

    import 作用: 导入/引入一个python标准模块,其中包括.py文件、带有__init__.py文件的目录。

    py3study
  • Python3 导入上级目录中的模块

    首先 sys.path 的作用是:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块

    py3study

扫码关注云+社区

领取腾讯云代金券