day20モジュール、ソフトウェアパッケージとディレクトリの仕様を紹介

1.インポートモジュール

1.1 2つの用途のpythonファイルがあります。

  1. プログラムが実行されているとおり
  2. モジュールは、Aとして導入されました

1.2という2つの違いは何ですか?

一例として、ファイルfooへ:

foo.py値name__ __ '__main__'、実行される1、
2、foo.pyをモジュールとして導入され、__ name__値'foo'で

print('模块foo==>')

# __all__=['x',] # 控制*代表的名字有哪些
x=1
def get():
    print(x)

def change():
    global x
    x=0

def say():
    print('我还活在内存中呢。。。。')
if __name__ == '__main__':
    print('文件被执行')
    get()
    change()
else:
    # 被当做模块导入时做的事情
    print('文件被导入')
    pass

インポートモジュールのために導入され、

長所と短所1.3輸入インポートモード

impotインポートモジュールは、接頭辞を使用して追加する必要があり、「モジュール。」
利点:現在では名前空間の名前で、確かに競合しない
欠点:接頭辞は、トラブルに表示されます。

1.4から... impot ...声明

インポート処理3

  1. モジュールの名前空間を作成
  2. 運転中に生成された操作foo.pyの名前は、名前空間のモジュールにスローされます
  3. 現在のネームスペースでは名前、名前とモジュールの名前空間のメモリアドレスを取得します
from foo import x # x=模块foo中值的内存地址
from foo import get
from foo import change

print(x)
print(get)
print(change)
x=333333333
print(x)
get()
change()
get()

print(x)
from foo import x # x=新地址
print(x)

インポートされたモジュールからのためにのために

1.5から... impot ...長所と短所

... impot ...接頭辞なしで使用する場合、モジュールをインポートします

利点:コードをより合理化

短所:簡単には現在の名前空間と混同されます

from foo import x # x=模块foo中值1的内存地址
x=1111

...インポートノート

  • インポート複数名の行(推奨されません)
  • すべての時間インポートモジュールの名前を使用することができます*
  • 別名モジュールから導入することができます
from foo import x,get,change
from foo import get as g
name='egon'
from foo import *
print(name)

from socket import *
'''
了解知识: * 导入时是访问对应模块的__all__的值,是一个列表
__all__=['x',] # 控制*代表的名字有哪些
'''

1.6モジュール検索パスの優先順位

あなたはモジュールをインポートするから...インポートするかどうかまたはインポートは、問題を見つけることに関連しています

優先順位
メモリ(ビルトインモジュール)
2、ハードディスク:ファイルの順に、順次、インポートするのsys.path検索モジュールに格納されています

# 值为一个列表,存放了一系列的对文件夹
# 其中第一个文件夹是当前执行文件所在的文件夹
>>> import sys
>>> sys.path
['', 'E:\\Python\\Python38\\python38.zip', 'E:\\Python\\Python38\\DLLs', 'E:\\Python\\Python38\\lib', 'E:\\Python\\Python38', 'E:\\Python\\Python38\\lib\\site-packages']
>>

最初のパスのsys.pathので、インポートモジュールに配置された実行可能ファイルに代わって、通常は空のパスであり、同じディレクトリ内のファイルを実行するには、適切にインポート作業をする必要がありますが、モジュールのためと、実行ファイルがにインポートされます異なる経路は、ソース・ファイルに対応するモジュールを確保するために依然として見つけることができる場合、経路がどこfoo.pyが/ pythoner /プロジェクトを想定している位置のsys.pathのfoo.pyにソースファイルパスを追加する必要があります/

import sys
sys.path.append(r'/pythoner/projects/') #临时添加
#找foo.py就把foo.py的文件夹添加到环境变量中,获取文件的绝对路径,再添加
import foo #无论foo.py在何处,我们都可以导入它了

学習:sys.modulesビューは、メモリモジュールにロードされています

import sys
import foo # foo=模块的内存地址
del foo

def func():
    import foo # foo=模块的内存地址

func()

# print('foo' in sys.modules)
print(sys.modules)

1.7仕様のモジュールを書きます

#!/usr/bin/env python #通常只在类lunix环境有效,作用是可以使用脚本名来执行,而无需直接调用解释器。

"The module is used to..." #模块的文档描述

import sys #导入模块

x=1 #定义全局变量,如果非必须,则最好使用局部变量,这样可以提高代码的易维护性,并且可以节省内存提高性能

class Foo: #定义类,并写好类的注释
    'Class Foo is used to...'
    pass

def test(): #定义函数,并写好函数的注释
    'Function test is used to…'
    pass

if __name__ == '__main__': #主程序
    test() #在被当做脚本执行时,执行此处的代码

知識の1.8補足機能

プロンプトのヒントを入力します(最低のPython 3.5)

#Python是一种强类型的动态语言
#可以:+类型,规定传入值的类型,本质上:后是添加的提示信息,可以根据需要填写
#->int 规定返回值的类型
#虽然规定了传入类型,但实际上还是可以传入其他类型的,传入值的规范
def register(name:str,age:int,hobbbies:tuple)->int:
 print(name)
 print(age)
 print(hobbbies)
 return 111

register(1,'aaa',[1,])
#可以添加默认值,默认值在类型后面添加
def register(name:str='egon',age:int=18,hobbbies:tuple=(1,2))->int:
 print(name)
 print(age)
 print(hobbbies)
 return 111
register()
res=register('egon',18,('play','music'))

1585325998024

2.パッケージ

2.1パッケージとは何ですか

パッケージには、ファイルを含むフォルダです__init__.py

なぜ2.2のパッケージを持っています

パッケージの性質は、モジュールブロックの形態であり、パケットはモジュールとして導入されます

2.3パッケージを使用する方法

import mmm
print(mmm.x)
print(mmm.y)
mmm.say()

from mmm import x

3つのパケットを導入する工程

1は、名前空間が得られ
2 _パッケージの下で実行される初期化 _.pyファイル、運転中に生成された名前は、名前空間1に投げ込まれ
、3、MMM GET名前空間の名前は、現在のファイルを実行します名前空間へのMMM 1

彼は強調した
パッケージ約1でインポート、関連書類は、また輸入に分かれているから...インポート... 2種類のあなたがインポートするときの原則に従う必要があります。

輸入時のいずれかの少しは、左のポイントは、それ以外の違法なパッケージでなければなりません。
図2に示すように、同じ名前のパケットでパケットA及びBはない2つの名前空間からのそのようなAAおよびBaなどのコンフリクトモジュール、ない
3、インポートファイルのインポート、ファイルから名前空間名を生成し、名前空間を生成し、インポート・パケットを名前は、そのパッケージには、下_、同じファイルから来ているのinit _.py、パッケージをインポートインポートファイルの自然の中で

絶対と相対的には2.4を導入する導入します

# 绝对导入,以包的文件夹作为起始来进行导入
#pool下的__init__.py
from pool import versions


# 相对导入:仅限于包内使用,不能跨出包(包内模块之间的的导入,推荐使用相对导入)
# .:表示当前文件夹
# ..:表示上一层文件夹
# 局限性:.不能超出foo之外

#pool下的__init__.py
from . import versions
'''
强调:
1、相对导入不能跨出包,所以相对导入仅限于包内模块之间相互导入
2、绝对导入是没有任何限制的,所以绝对导入是一种通用的导入方式
'''

#针对包内部模块之间的相互导入推荐使用相对导入,需要特别强调:
'''
1、相对导入只能在包内部使用,用相对导入不同目录下的模块是非法的

2、无论是import还是from-import,但凡是在导入时带点的,点的左边必须是包,否则语法错误
'''

包インポート*

'''
在使用包时同样支持from pool.futures import * ,
毫无疑问*代表的是futures下__init__.py中所有的名字,通用是用变量__all__来控制*代表的意思
'''
#futures下的__init__.py
__all__=['process','thread']

'''
包内部的目录结构通常是包的开发者为了方便自己管理和维护代码而创建的,
这种目录结构对包的使用者往往是无用的,此时通过操作__init__.py可以“隐藏”包内部的目录结构,
降低使用难度,比如想要让使用者直接使用
'''
import pool

pool.check()
pool.ProcessPoolExecutor(3)
pool.ThreadPoolExecutor(3)

# 需要操作pool下的__init__.py
from .versions import check
from .futures.process import ProcessPoolExecutor
from .futures.thread import ThreadPoolExecutor

3.ソフトウェア開発ディレクトリの指定

プログラムの可読性と保守性を改善するために、我々はこの及びその他の規範として重要とコーディングスタイル、うまく設計されたソフトウェアのディレクトリ構造でなければなりません。ディレクトリ指定は限り次のようにあなたは、あなたのソフトウェアfooという名前を想定し、推奨されるディレクトリ構造が明確に読むことができるように、何のハードと高速標準ソフトウェアではありません

3.1ソフトウェアのディレクトリ構造

Foo/ 
|-- core/ # 存放业务逻辑相关代码
|   |-- core.py
|
|-- api/ # 存放接口文件,接口主要用于为业务逻辑提供数据操作。
|   |-- api.py 
|
|-- db/ # 放操作数据库相关文件,主要用于与数据库交互
|   |-- db_handle.py
|
|-- lib/ # 存放程序中常用的自定义模块
|   |-- common.py
|
|-- conf/ # 存放配置文件
|   |-- settings.py
|
|-- run.py # 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹				sys.path的第一个路径,这样就省去了处理环境变量的步骤
|-- setup.py # 安装、部署、打包的脚本。
|-- requirements.txt # 存放软件依赖的外部Python包列表
|-- README # 项目说明文件

ソフトウェアの説明3.2 README

READMEについて、これはすべてのプロジェクトファイルを持つべきである必要があり、目的は、読者がすぐにプロジェクトを理解することができ、プロジェクトの説明の簡潔な情報をできるようにすることです。これは、以下の事項ことに留意すべきです。

'''
1、软件定位,软件的基本功能;

2、运行代码的方法: 安装环境、启动命令等;

3、简要的使用说明;

4、代码目录结构说明,更详细点可以说明软件的基本原理;

5、常见问题说明。
'''

おすすめ

転載: www.cnblogs.com/Henry121/p/12592683.html
おすすめ