4,建立包練習的程序python
import os
os.makedirs('glance/api') #建立包
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w')) #在對應包裏建立文件
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l) #以前將打開的文件的句柄都放入列表,以便在此同一關閉
# 建立的目錄結構
glance/ #Top-level package
├── __init__.py #Initialize the glance package
├── api #Subpackage for api
│ ├── __init__.py
│ ├── policy.py
│ └── versions.py
├── cmd #Subpackage for cmd
│ ├── __init__.py
│ └── manage.py
└── db #Subpackage for db
├── __init__.py
└── models.py
目錄結構
#在對應的文件寫入內容
#policy.py
def get():
print('from policy.py')
#versions.py
def create_resource(conf):
print('from version.py: ',conf)
#manage.py
def main():
print('from manage.py')
#models.py
def register_models(engine):
print('from models.py: ',engine)
文件內容
5,import 方法導入和使用mysql
咱們在與包glance同級別的文件中測試,此驗證程序寫在與glance同一文件加下。sql
import glance.db.models
glance.db.models.register_models('mysql')
6,from ... import ...方法導入和使用數據庫
6.1,api
6.2,咱們在與包glance同級別的文件中測試app
from glance.db import models #導入包中的一個模塊
models.register_models('mysql') #從導入到模塊調用模塊內函數
from glance.db.models import register_models #能夠只導入其中的一個方法
register_models('mysql')
7,關於 __init__.py文件運維
不論是哪一種方式,只要是第一次導入包或者是包的任何其餘部分,都會依次執行包下的__init__.py文件(咱們能夠在每一個包的文件內都打印一行內容來驗證一下),這個文件能夠爲空,可是也能夠存放一些初始化包的代碼。ide
8,關於從包中導入全部包中的模塊函數
導入一個設計好的使用該語句 from glance.api import *
此處是想從包api中導入全部,實際上該語句只會導入包api下__init__.py文件並執行,咱們能夠在這個文件中定義「__all__ = ['模塊名']」,來實現導入包內全部模塊。測試
# 在api包內的__init__.py文件里加入「__all__ = ['policy','versions']」
from glance.api import *
policy.get()
9,咱們在glance/api/version.py中想要導入glance/cmd/manage.py
在glance/api/version.py
#絕對導入
from glance.cmd import manage
manage.main()
#相對導入
from ..cmd import manage
manage.main(
注意:必定要在與glance同級別的模塊中輸入一面的語句,並執行:
from glance.api import versions
在version.py寫入的語句若是在version.py開始執行(即按下run),會報錯,找不到。由於不是從與version.py同級別的文件開始導入的。
可是,按上面的方法卻能夠,是由於from glance.api import versions執行的時候已經將到達glance的路徑加載在sys.path中了,因此在version.py中可以從glance開始導入。
10,
特別須要注意的是:能夠用import導入內置或者第三方模塊(已經在sys.path中),可是要絕對避免使用import來導入自定義包的子模塊(沒有在sys.path中),應該使用from... import ...的絕對或者相對導入,且包的相對導入只能用from的形式。
好比咱們想在glance/api/versions.py中導入glance/api/policy.py,
#在version.py中
import policy
policy.get()
沒錯,咱們單獨運行version.py是一點問題沒有的,運行version.py的路徑搜索就是從當前路徑開始的,因而在導入policy時能在當前目錄下找到
可是你想啊,你子包中的模塊version.py極有多是被一個glance包同一級別的其餘文件導入,好比咱們在於glance同級下的一個test.py文件中導入version.py就會找不到要導入包的路徑
11,能夠經過修改sys.path保存的路徑進行修改
import sys
sys.path.insert(0,'C:\\Users\\Administrator\\PycharmProjects\\s9\\day21\\dir')
# print(sys.path)
from glance.api import policy
policy.get()
from dir import glance
glance.db.models.register_models('mysql')
glance.api.policy.get()
form . import api
form . import cmd
import os
import sys
sys.path.append(os.path.dirname(os.getcwd()))
#獲取當前路徑的上一個目錄的路徑,並將路徑添加到sys.path中,這樣即便不是在pycharm中也能執行了。
from core import core
if __name__ == '__main__':
core.main()
try:
ret = int(input('number>>>'))
print(ret*'*')
except ValueError:
print('您輸入的內容有錯,請輸入一個數字')
except Exception:
print('你錯了,老鐵')
else:
print('沒有異常的時候執行else中的代碼')
print('===========')
try:
被檢測的代碼塊
except 異常類型:
try中一旦檢測到異常,就執行這個位置的邏輯
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
try:
print('1111')
print('2222')
ret = int(input('number >>>'))
print(ret*'*')
except Exception as error: #用萬能異常的時候加上‘as ereror’就會將是什麼錯誤提示出來。
print('你錯了,老鐵',error)
16.4,使用順序格式
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
#except Exception as e:
# print(e)
else:
print('try內代碼塊沒有異常則執行我')
finally:
print('不管異常與否,都會執行該模塊,一般是進行清理工做')
17,主動觸發異常
try:
raise TypeError('類型錯誤')
except Exception as e:
print(e)
# 類型錯誤
18,自定義異常
class EvaException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EvaException('類型錯誤')
except EvaException as e:
print(e)
# 類型錯誤
19,異常的關係
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError | +-- AssertionError | +-- AttributeError | +-- EnvironmentError | | +-- IOError | | +-- OSError | | +-- WindowsError (Windows) | | +-- VMSError (VMS) | +-- EOFError | +-- ImportError | +-- LookupError | | +-- IndexError | | +-- KeyError | +-- MemoryError | +-- NameError | | +-- UnboundLocalError | +-- ReferenceError | +-- RuntimeError | | +-- NotImplementedError | +-- SyntaxError | | +-- IndentationError | | +-- TabError | +-- SystemError | +-- TypeError | +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning