包和模块

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

控制模块被全部导入的内容

问题:

  当使用 ‘from module import * ‘ 语句时,希望对从模块或包导出的符号进行精确控制

解决方案:

  在你的模块中定义一个变量__all__ 来明确地列出需要导出的内容

 1 # someodule.py
 2
 3 def spam():
 4     pass
 5
 6 def grok():
 7     pass
 8
 9 blah = 42
10
11 __all__ = [‘spma‘, ‘pass‘]

注意:

  尽管强烈反对使用‘from module import *‘, 但是在定义了大量变量名的模块中频繁使用。如果你不做任何事, 这样的导入将会导入所有不以下划线开头的。另一方面, 如果定义了all , 那么只有被列举出的东西会被导出。

  如果你将all 定义成一个空列表, 没有东西将被导出。如果all 包含未定义的名字, 在导入时引起AttributeError。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

使用相对路径名导入包中子模块

问题:

  将代码组织成包, 想用import 语句从另一个包名没有硬编码过的包的中导入子模块

解决方案:

  使用包的相对导入,使一个的模块导入同一个包的另一个模块举个例子,假设在你的文件系统上有mypackage 包,组织如下:

mypackage/
    __init__.py
    A/
        __init__.py
        spam.py
        grok.py
    B/
        __init__.py
        bar.py

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

如果模块mypackage.A.spam 要导入同目录下的模块grok,它应该包括的import语句如下:

# mypackage/A/spam.py
from . import grok

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

如果模块mypackage.A.spam 要导入不同目录下的模块B.bar,它应该使用的import语句如下:

# mypackage/A/spam.py
from ..B import bar

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

两个import 语句都没包含顶层包名,而是使用了spam.py 的相对路径

注意:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

相对导入只适用于在合适的包中的模块。尤其是在顶层的脚本的简单模块中,它们将不起作用。如果包的部分被作为脚本直接执行,那它们将不起作用例如:

% python3 mypackage/A/spam.py # Relative imports fail

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

另一方面,如果你使用Python 的-m 选项来执行先前的脚本,相对导入将会正确运行。例如:

% python3 -m mypackage.A.spam # Relative imports work

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

将模块分割成多个文件

问题:

  你想将一个模块分割成多个文件。但是你不想将分离的文件统一成一个逻辑模块时使已有的代码遭到破坏

解决方案:

  程序模块可以通过变成包来分割成多个独立的文件。考虑下下面简单的模块:

# mymodule.py
class A:
    def spam(self):
            print(‘A.spam‘)

class B(A):
    def bar(self):
        print(‘B.bar‘)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

假设你想mymodule.py 分为两个文件,每个定义的一个类。要做到这一点,首先用mymodule 目录来替换文件mymodule.py。这这个目录下,创建以下文件:

mymodule/
    __init__.py
    a.py
    b.py

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

在a.py 文件中插入以下代码:

# a.py
class A:
    def spam(self):
        print(‘A.spam‘)    

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

在b.py 文件中插入以下代码:

# b.py
from .a import A
class B(A):
    def bar(self):
        print(‘B.bar‘)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

最后,在init .py 中,将2 个文件粘合在一起:

# __init__.py
from .a import A
from .b import B

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

如果按照这些步骤,所产生的包MyModule 将作为一个单一的逻辑模块:

>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>> b = mymodule.B()
>>> b.bar()
B.bar

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

读取位于包中的数据文件

问题:

  你的包中包含代码需要去读取的数据文件。你需要尽可能地用最便捷的方式来做这件事

解决方案:

  假设你的包中的文件组织成如下:

mypackage/
    __init__.py
    somedata.dat
    spam.py

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

现在假设spam.py 文件需要读取somedata.dat 文件中的内容。你可以用以下代码来完成:

# spam.py
import pkgutil
data = pkgutil.get_data(__package__, ‘somedata.dat‘)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

将文件夹加入到sys.path

问题:

  你无法导入你的Python 代码因为它所在的目录不在sys.path 里。你想将添加新目录到Python 路径,但是不想硬链接到你的代码

解决方案:

  常用的方式将新目录添加到sys.path.例如:

import sys
from os.path import abspath, join, dirname
sys.path.insert(0, abspath(dirname(‘__file__‘), ‘src‘))

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

通过字符串名导入模块

问题:

  你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令

解决方案:

  使用importlib.import module() 函数来手动导入名字为字符串给出的一个模块或者包的一部分。举个例子:

import importlib

‘‘‘
直接导入模块,import math
‘‘‘
math = importlib.import_module(‘math‘)
res = math.sin(2)
print(‘math sin:‘, res)

‘‘‘
直接导入模块,类似于import urllib.request
‘‘‘
mod = importlib.import_module(‘urllib.request‘)
req = mod.urlopen(‘http://www.meizitu.com/‘)
response = req.read().decode(‘gbk‘)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Helvetica; color: #29556f }

分发包

问题:

  你已经编写了一个有用的库,想将它分享给其他人

解决方案:

  如果你想分发你的代码,第一件事就是给它一个唯一的名字,并且清理它的目录结构。例如,一个典型的函数库包会类似下面这样:

projectname/
    README.txt
    Doc/
        documentation.txt
    projectname/
        __init__.py
        foo.py
        bar.py
    utils/
        __init__.py
        spam.py
        grok.py
    examples/
        helloworld.py

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

要让你的包可以发布出去,首先你要编写一个setup.py ,类似下面这样:

# setup.py
from distutils.core import setup

setup(name=‘projectname‘,
    version=‘1.0‘,
    author=‘Your Name‘,
    author_email=‘[email protected]‘,
    url=‘http://www.you.com/projectname‘,
    packages=[‘projectname‘, ‘projectname.utils‘],
)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

下一步,就是创建一个MANIFEST.in 文件,列出所有在你的包中需要包含进来的非源码文件:

# MANIFEST.in
include *.txt
recursive-include examples *
recursive-include Doc *

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

确保setup.py 和MANIFEST.in 文件放在你的包的最顶级目录中。一旦你已经做了这些,你就可以像下面这样执行命令来创建一个源码分发包了:

$ bash python3 setup.py sdist

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #458276 }
span.s1 { color: #000000 }

它会创建一个文件比如”projectname-1.0.zip” 或“projectname-1.0.tar.gz”, 具体依赖于你的系统平台。如果一切正常,这个文件就可以发送给别人使用或者上传至Python Package Index.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
span.s1 { color: #ff2600 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
span.s1 { color: #ff2600 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

时间: 2024-11-09 04:21:33

包和模块的相关文章

Python基础之包与模块

本文和大家分享的主要是python中包与模块相关内容,一起来看看吧,希望对大家学习python有所帮助. 摘要 1. 为重用以及更好的维护代码, Python 使用了模块与包:一个 Python 文件就是一个模块,包是组织模块的特殊目录(包含 __init__.py 文件). 2. 模块搜索路径, Python 解释器在特定的目录中搜索模块,运行时 sys.path 即搜索路径. 3. 使用 import 关键字导入模块,注意 import * 与 __all__ 的关系. 1. 模块与导入 A

包与模块

概念: python模块: 自我包含并且有组织的代码片段为模块. 表现形式为:写的代码保存为文件.这个文件就是一个模块.sample.py其中smaple为模块名字. python包: 包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境. 1.模块的使用 使用模块需要先使用import关键字导入模块,然后按照 模块名.函数 的格式使用这个函数. 例如:我们想要进行一些数学运算,就需要导入 math 模块 1 import math 2 3 math.co

python 3 包与模块

包与模块 一 .模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块 2 为何要使用模块 退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通

Python/模块与包之模块

Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用模块? 3.1 import    通过import导入要使用的模块 1 #spam.py 2 print('from the spam.py') 3 4 money=1000 5 6 def read1(): 7 print('spam->read1->money',1000) 8 9 def

iOS开发之Socket通信实战--Request请求数据包编码模块

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地 址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索 这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要

模块下篇————包和模块

logging模块 用于便捷记录日志且线程安全的模块 logging模块的几种等级 默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息. level = logging.DEBUG设置日志级别 import logging lo

perl 第十四章 Perl5的包和模块

第十四章 Perl5的包和模块 by flamephoenix 一.require函数  1.require函数和子程序库  2.用require指定Perl版本二.包  1.包的定义  2.在包间切换  3.main包  4.包的引用  5.指定无当前包  6.包和子程序  7.用包定义私有数据  8.包和系统变量  9.访问符号表三.模块  1.创建模块  2.导入模块  3.预定义模块 一.require函数    用require函数可以把程序分割成多个文件并创建函数库.例如,在myfi

Rust 功能函数的关系、包和模块简介

Rust 功能函数的关系.包和模块简介 一.功能函数之间的关系 前面看到,一个文件中可以定义多个 function 功能函数,这些功能函数可以被相互使用.程序的入口是main(). 在一个文件中,各个功能函数的定义和使用不受功能函数定义的顺序约束.也就是说,不需要像 C 语言一样,在使用一个函数而还没有定义函数之前要有一个声明语句:而像 java 一样,只要声明的功能函数在一个文件内,可以忽略功能函数在文件中出现的顺序. 二.文件的包管理 当一个文件中的功能函数越来越多,阅读和修改都是个问题.因

Python包和模块的导入问题

模块--代码封装 模块是Python组织代码的基本方式.Python的脚本都是用扩展名为py的文本文件保存,一个脚本可以单独运行,也可以导入另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module).就是说,我们在python里写的所有代码文件都可以叫模块. 导入的时候,模块名与脚本的文件名相同,例如我们编写了一个名为items.py 的脚本,则在另外一个脚本中用import item语句来导入它. windows环境下在python中查看安装有哪些模块 >>> import