久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

寫了5年P(guān)ython才沉淀的7條工程習(xí)慣,從調(diào)包俠到扛住線上事故

寫了5年P(guān)ython才沉淀的7條工程習(xí)慣,從調(diào)包俠到扛住線上事故 寫了 5 年 Python從一個(gè)只會(huì)寫腳本的“調(diào)包俠”到能在生產(chǎn)環(huán)境里扛住流量、排查線上事故的工程師中間真的踩過(guò)不少坑。有些坑是文檔里查不到的有些坑只有你被 on-call 電話叫醒、盯著日志翻到天亮才會(huì)真正記住。今天不分享框架源碼也不講算法優(yōu)化就聊聊我這 5 年下來(lái)最終留下的 7 條 Python 工程習(xí)慣。這些習(xí)慣不是從哪本書里抄的而是被線上事故、代碼評(píng)審、團(tuán)隊(duì)協(xié)作逼出來(lái)的。如果你正在寫 Python或者你團(tuán)隊(duì)里的 Python 代碼總出幺蛾子這篇內(nèi)容應(yīng)該能給你一些參考。1. 先定牢“類型邊界”再談代碼復(fù)用1.1 從一次接口事故說(shuō)起先講個(gè)真實(shí)經(jīng)歷。早年在某公司維護(hù)一個(gè)支付回調(diào)模塊上游傳來(lái)一個(gè) JSON里面有個(gè)amount字段。當(dāng)時(shí)圖省事代碼里直接if data[amount] 100判斷也沒(méi)做類型轉(zhuǎn)換。某天上游改了字段格式把數(shù)字字符串100.00傳了進(jìn)來(lái)比較結(jié)果完全正常但后面做金額計(jì)算時(shí)字符串和浮點(diǎn)數(shù)混在一起出現(xiàn)了小數(shù)點(diǎn)精度問(wèn)題直接導(dǎo)致一筆訂單對(duì)賬差了 1 分錢。排查了整整兩個(gè)晚上最后發(fā)現(xiàn)是類型邊界沒(méi)管好。這件事給我的教訓(xùn)是Python 是動(dòng)態(tài)語(yǔ)言但不代表你可以在工程代碼里“放飛自我”。動(dòng)態(tài)類型給你靈活也把責(zé)任推給了調(diào)用方和未來(lái)的維護(hù)者。你寫函數(shù)時(shí)自己知道參數(shù)是什么類型但三個(gè)月后的你跟現(xiàn)在的你完全是兩個(gè)人更別說(shuō)團(tuán)隊(duì)里還有其他人。1.2 我最終留下的類型標(biāo)注習(xí)慣我現(xiàn)在寫任何新模塊都會(huì)遵循這幾條所有函數(shù)參數(shù)和返回值都加類型標(biāo)注type hints即使只是def foo(x: int) - str這樣的基礎(chǔ)標(biāo)注。數(shù)據(jù)類用dataclass定義而不是只靠 dict 傳遞結(jié)構(gòu)。這樣字段名、默認(rèn)值、類型都一目了然也方便 IDE 補(bǔ)全和靜態(tài)檢查。涉及外部接口的數(shù)據(jù)結(jié)構(gòu)用pydantic或dataclass做一層顯式校驗(yàn)和轉(zhuǎn)換絕不讓“裸 dict”穿過(guò)服務(wù)邊界。在 CI 里跑mypy把它當(dāng)成強(qiáng)制檢查項(xiàng)而不是可選的錦上添花。有人說(shuō) Python 加類型標(biāo)注麻煩但我算過(guò)一筆賬寫標(biāo)注的時(shí)間大概是寫函數(shù)體時(shí)間的五分之一但能省掉排查類型 bug 的時(shí)間可能是十倍。尤其是服務(wù)多了之后調(diào)用鏈一長(zhǎng)類型標(biāo)注就是一張隱性的接口文檔。1.3 動(dòng)態(tài)語(yǔ)言的邊界在哪里當(dāng)然不是所有代碼都要上類型。臨時(shí)腳本、一次性數(shù)據(jù)處理我從來(lái)不用mypy因?yàn)椴恢档?。我的判斷?biāo)準(zhǔn)是這段代碼的生命周期是否超過(guò)一周是否需要被其他人調(diào)用是否要跟外部系統(tǒng)交互如果三個(gè)問(wèn)題里有一個(gè)“是”就值得加類型標(biāo)注和校驗(yàn)。另外還要注意類型標(biāo)注不等于運(yùn)行時(shí)校驗(yàn)。def foo(x: int)并不會(huì)在傳字符串時(shí)自動(dòng)報(bào)錯(cuò)。如果你需要嚴(yán)格校驗(yàn)必須靠pydantic或者在函數(shù)入口手動(dòng)isinstance。我之前就用pydantic統(tǒng)一管理所有 HTTP 請(qǐng)求和響應(yīng)的模型既做了類型約束又自動(dòng)生成了文檔還順便處理了反序列化一舉三得。提示如果你還在用裸 dict 傳遞業(yè)務(wù)數(shù)據(jù)趁早換成 dataclass 或 pydantic。這個(gè)習(xí)慣越早養(yǎng)成后面重構(gòu)的痛越少。2. 配置不進(jìn)代碼環(huán)境與依賴嚴(yán)格分離2.1 那段被配置文件支配的歲月我見(jiàn)過(guò)最離譜的代碼是把數(shù)據(jù)庫(kù)密碼直接寫在 Python 文件里硬編碼成全局變量然后整個(gè)團(tuán)隊(duì)共享。更離譜的是這個(gè)代碼還被提交到了代碼倉(cāng)庫(kù)最后因?yàn)橐粋€(gè)內(nèi)部工具掃描泄露了生產(chǎn)環(huán)境的連接信息不得不緊急改密碼、重建實(shí)例。那是我第一次意識(shí)到配置管理不是“以后再說(shuō)”的事而是工程底線。后來(lái)我接手過(guò)一套老系統(tǒng)配置全部堆在一個(gè)settings.py里里面寫了開(kāi)發(fā)、測(cè)試、預(yù)發(fā)、生產(chǎn)四套配置通過(guò)一個(gè)ENV環(huán)境變量來(lái)切換??粗孟駴](méi)問(wèn)題但每次上線都心驚膽戰(zhàn)因?yàn)橹灰腥烁牧艘恍锌赡芫蜁?huì)影響所有環(huán)境。某次預(yù)發(fā)環(huán)境連了生產(chǎn)庫(kù)還跑了一次數(shù)據(jù)遷移差點(diǎn)釀成大事故。2.2 環(huán)境管理與依賴鎖定的利器現(xiàn)在我的習(xí)慣是代碼庫(kù)里不出現(xiàn)任何環(huán)境相關(guān)的配置值只出現(xiàn)配置引用。環(huán)境變量來(lái)了填進(jìn)去配置中心來(lái)了從遠(yuǎn)端拉代碼本身永遠(yuǎn)不知道自己是跑在哪套環(huán)境。具體做法分三層12-factor 風(fēng)格配置所有配置項(xiàng)從環(huán)境變量讀取代碼里只有os.getenv(DB_HOST)這類調(diào)用。本地開(kāi)發(fā)用.env文件統(tǒng)一管理用python-dotenv加載但這個(gè)文件不提交到 git。依賴環(huán)境也要隔離用venv或poetry管理虛擬環(huán)境用requirements.txt或poetry.lock鎖定精確版本。所有新依賴必須通過(guò)鎖文件變更不能直接 pip install 到全局。我偏好poetry因?yàn)樗岩蕾嚬芾?、虛擬環(huán)境、打包發(fā)布統(tǒng)一起來(lái)了pyproject.toml 里直接寫清依賴范圍和 Python 版本比純 requirements 文件更清晰。團(tuán)隊(duì)新人來(lái)了一條命令poetry install就能把環(huán)境拉起來(lái)省得互相問(wèn)“你裝的什么版本”。2.3 環(huán)境變量、配置中心怎么選小團(tuán)隊(duì)、單體服務(wù)環(huán)境變量完全夠用。但服務(wù)多了以后環(huán)境變量管理會(huì)變得混亂——幾十個(gè)服務(wù)每套環(huán)境幾十個(gè)變量靠人工維護(hù)很容易出錯(cuò)。這時(shí)候就需要配置中心了比如 etcd、consul、或云廠商的配置管理服務(wù)。我的選擇邏輯很簡(jiǎn)單服務(wù)數(shù)少于 5 個(gè)環(huán)境變量 .env 文件夠用。服務(wù)數(shù)多于 5 個(gè)但配置量不大用配置中心拉取啟動(dòng)時(shí)拿不到配置就直接失敗避免帶病啟動(dòng)。配置變更頻繁需要?jiǎng)討B(tài)刷新選帶推送能力的配置中心而不是重啟服務(wù)。配置中心雖然好用但也會(huì)引入新依賴。我們?cè)谀硞€(gè)項(xiàng)目里跑了 consul但忘了處理它掛掉的情況結(jié)果配置拉不到服務(wù)全部起不來(lái)。后來(lái)加了本地緩存作為兜底即使配置中心掛了也用上一次的緩存啟動(dòng)再配合告警提醒人工介入。注意代碼里盡量不要用try/except吞掉配置加載異常。配置缺失時(shí)要及時(shí)暴露出來(lái)最好在啟動(dòng)階段就 fail fast否則線上服務(wù)可能半死不活看似在運(yùn)行實(shí)際功能全壞。3. 日志不是打出來(lái)就完事要能“撈得回來(lái)”3.1 線上排障時(shí)日志的救命場(chǎng)景有一回線上告警說(shuō)某個(gè)接口成功率驟降。我打開(kāi)日志平臺(tái)輸入服務(wù)名和關(guān)鍵字結(jié)果刷出來(lái)的全是格式不一的文本有的行是print打出來(lái)的有的行是logger.info寫的還有的日志里根本沒(méi)帶請(qǐng)求 ID完全沒(méi)法把一次用戶請(qǐng)求的完整鏈路串起來(lái)。最后只能靠猜先看 Nginx 日志找到出錯(cuò)的請(qǐng)求再根據(jù)時(shí)間戳去翻應(yīng)用日志效率極低。那次之后我才明白日志不是“有就行”而是要有“可查詢性”。所謂可查詢性就是你能在短時(shí)間內(nèi)通過(guò)一組固定維度把某一次請(qǐng)求的所有相關(guān)日志全部撈出來(lái)。3.2 結(jié)構(gòu)化日志與日志追蹤ID我現(xiàn)在打日志只用一個(gè)標(biāo)準(zhǔn)結(jié)構(gòu)化 JSON 日志。每一條日志包含時(shí)間、級(jí)別、logger 名稱、消息、上下文數(shù)據(jù)用 json.dumps 統(tǒng)一序列化或者直接用python-json-logger這類庫(kù)。為什么用 JSON因?yàn)槿罩鞠到y(tǒng)里可以按字段索引不用寫正則去摳文本。最關(guān)鍵的是追蹤 ID。每個(gè)請(qǐng)求入口生成一個(gè)trace_id或者叫 request_id通過(guò)中間件注入到 context 里然后所有業(yè)務(wù)日志都帶著這個(gè) ID。這樣排查問(wèn)題時(shí)只需要按 trace_id 搜索就能把一次請(qǐng)求的訪問(wèn)日志、業(yè)務(wù)日志、異常堆棧全部串在一起。Python 里實(shí)現(xiàn)這個(gè)有很多方式老項(xiàng)目我會(huì)用contextvars加一個(gè)日志過(guò)濾器在日志格式化時(shí)自動(dòng)把 trace_id 塞進(jìn)記錄里業(yè)務(wù)代碼根本不用手動(dòng)傳參。新項(xiàng)目直接上 OpenTelemetry 這類鏈路追蹤框架一步到位。3.3 日志級(jí)別的工程約定級(jí)別這件事團(tuán)隊(duì)里必須有共同語(yǔ)言。我踩過(guò)最典型的一個(gè)坑是有人把重要業(yè)務(wù)操作放在logger.debug結(jié)果生產(chǎn)環(huán)境日志級(jí)別是 INFO關(guān)鍵信息全丟了也有人用logger.error打普通業(yè)務(wù)流程導(dǎo)致告警刷屏真正的故障被淹沒(méi)。我現(xiàn)在定的約定是DEBUG開(kāi)發(fā)調(diào)試線上默認(rèn)關(guān)閉。INFO記錄業(yè)務(wù)節(jié)點(diǎn)的關(guān)鍵事件比如下單、支付、狀態(tài)變更帶有可追蹤的 trace_id。WARNING可能有風(fēng)險(xiǎn)但不影響主流程比如重試、降級(jí)、稍后處理。ERROR發(fā)生了會(huì)影響單次請(qǐng)求或功能的問(wèn)題需要記錄異常堆棧和上下文數(shù)據(jù)。CRITICAL系統(tǒng)級(jí)故障必須觸發(fā)立即告警。這條清單我寫了放在團(tuán)隊(duì) wiki 里新人來(lái)了先讀一遍。告警規(guī)則只匹配 WARNING 和 ERROR且必須有對(duì)應(yīng)的 trace_id否則視為無(wú)效日志。心得日志里不要搜集身份證號(hào)、密碼、token 這類敏感信息但可以把脫敏后的值放進(jìn)去。我見(jiàn)過(guò)有人把完整手機(jī)號(hào)打進(jìn)日志最后數(shù)據(jù)庫(kù)被脫敏日志卻沒(méi)脫敏成了新的泄露出口。4. 單元測(cè)試是給未來(lái)合作者的“安全網(wǎng)”4.1 為什么寫測(cè)試是對(duì)別人的負(fù)責(zé)很多人覺(jué)得“這段代碼我自己跑通了不用寫測(cè)試”但工程代碼的目標(biāo)不是“在我電腦上能跑”而是“在任何環(huán)境里、任何時(shí)間、任何人都能安全地改動(dòng)”。有測(cè)試兜底你才敢重構(gòu)沒(méi)測(cè)試兜底每一次改動(dòng)都是高空踩鋼絲。我印象最深的一次某同事改了一個(gè)工具函數(shù)把默認(rèn)參數(shù)從None改成了空列表結(jié)果下層模塊直接復(fù)用了這個(gè)函數(shù)導(dǎo)致所有請(qǐng)求共享同一個(gè)列表內(nèi)存越積越多最后服務(wù) OOM。如果那個(gè)工具函數(shù)有一個(gè)簡(jiǎn)單的單元測(cè)試測(cè)試?yán)锒鄠饕粋€(gè)值再斷言兩次調(diào)用互不影響這種問(wèn)題根本走不到線上。4.2 測(cè)試金字塔與常用工具我現(xiàn)在寫測(cè)試遵循金字塔原則底層單元測(cè)試最多覆蓋純函數(shù)和業(yè)務(wù)邏輯中間層集成測(cè)試驗(yàn)證模塊間的交互頂層端到端測(cè)試只覆蓋關(guān)鍵核心鏈路數(shù)量很少。Python 里我最常用的組合是pytest功能強(qiáng)大、fixture 靈活能跑參數(shù)化用例。pytest-cov統(tǒng)計(jì)覆蓋率但我不追求 100%只要求核心模塊 90% 以上。responses或respxmock HTTP 請(qǐng)求測(cè)服務(wù)調(diào)用。factory-boy生成測(cè)試數(shù)據(jù)比手寫 fixture 清晰。fixture 的使用有個(gè)要點(diǎn)不要把 fixture 寫成“一個(gè)函數(shù)造一個(gè)對(duì)象”而是盡量小而可組合。比如我定義一個(gè)userfixture一個(gè)orderfixtureorder 依賴 user。這樣測(cè)試用例里可以自由組合不用的數(shù)據(jù)不會(huì)白造跑起來(lái)也快。4.3 如何讓測(cè)試不拖累開(kāi)發(fā)速度很多人拒絕寫測(cè)試是覺(jué)得“寫測(cè)試?yán)速M(fèi)時(shí)間”。但我發(fā)現(xiàn)只要把測(cè)試放進(jìn)常規(guī)開(kāi)發(fā)流程反而能省時(shí)間。我的做法是寫完一個(gè)功能先寫這個(gè)功能的最小測(cè)試用例然后跑一遍確認(rèn)測(cè)試能不能抓住 bug。不需要一次寫全先把主干覆蓋了后面再迭代補(bǔ)充邊界測(cè)試。測(cè)試能跑多快單元測(cè)試應(yīng)該控制在幾秒以內(nèi)。如果測(cè)試超過(guò)幾十秒團(tuán)隊(duì)就會(huì)不喜歡跑最終淪為“沒(méi)人跑的擺設(shè)”。我有個(gè)原則所有單元測(cè)試全部?jī)?nèi)存化用 SQLite 或 mock 替代外部服務(wù)不依賴真實(shí)數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)。集成測(cè)試單獨(dú)用一個(gè) marker 標(biāo)記只在 CI 的特定 job 里運(yùn)行。這樣可以保證日常開(kāi)發(fā)pytest -m unit在一分鐘內(nèi)跑完。CI 里面再加一道強(qiáng)制門檻覆蓋率下降不能超過(guò) 1%新增代碼的行覆蓋率要高于 80%。一開(kāi)始會(huì)覺(jué)得苛刻但跑一段時(shí)間后團(tuán)隊(duì)寫代碼時(shí)就會(huì)本能地思考“這段邏輯怎么測(cè)”反而促使他們寫得更容易測(cè)試。提醒mock 要節(jié)制。過(guò)度 mock 會(huì)讓測(cè)試變成“自嗨”根本測(cè)不到真實(shí)邏輯。比如把一個(gè)外部 HTTP 調(diào)用 mock 成返回值卻忘了真實(shí)接口是異步還是同步這種測(cè)試毫無(wú)意義。寧可少寫幾個(gè)偽測(cè)試也要保證每個(gè)測(cè)試真的能代表一段真實(shí)行為。5. 異常與錯(cuò)誤處理讓失敗也成為接口的一部分5.1 裸except的慘痛教訓(xùn)Python 的except特別容易濫用。我見(jiàn)過(guò)無(wú)數(shù)代碼try: do_something() except: pass這個(gè)寫法相當(dāng)于告訴計(jì)算機(jī)“不管出了什么錯(cuò)你都別吭聲?!苯Y(jié)果就是錯(cuò)誤被吞掉服務(wù)繼續(xù)跑但狀態(tài)已經(jīng)錯(cuò)了。我處理過(guò)最慘的一個(gè) case某定時(shí)任務(wù)里裸捕獲了所有異常導(dǎo)致數(shù)據(jù)庫(kù)寫入失敗也沒(méi)人發(fā)現(xiàn)連續(xù)跑了三天產(chǎn)生了大量臟數(shù)據(jù)最后只能人工清洗。所以我的第一條鐵律是永遠(yuǎn)不要用裸except。至少要寫except Exception因?yàn)閑xcept:連KeyboardInterrupt和SystemExit也會(huì)捕獲容易讓程序無(wú)法退出。更合理的是按具體異常類型捕獲比如except ValueError、except KeyError讓錯(cuò)誤處理有針對(duì)性。5.2 自定義異常體系與錯(cuò)誤碼為什么需要自定義異常因?yàn)閮?nèi)置異常只能表達(dá)“什么類型錯(cuò)了”不能表達(dá)“業(yè)務(wù)哪里錯(cuò)了”。我給你看一個(gè)反例某個(gè)服務(wù)里到處raise ValueError(用戶不存在)然后調(diào)用方統(tǒng)一except ValueError結(jié)果參數(shù)校驗(yàn)錯(cuò)誤也被當(dāng)成用戶不存在處理返回給前端的是完全錯(cuò)誤的信息?,F(xiàn)在我習(xí)慣為每個(gè)模塊定義異?;惐热鏲lass ServiceError(Exception): 業(yè)務(wù)服務(wù)基礎(chǔ)異常 class UserNotFoundError(ServiceError): code USER_NOT_FOUND message 用戶不存在 class PaymentFailedError(ServiceError): code PAYMENT_FAILED message 支付失敗上層捕獲ServiceError然后根據(jù)code映射 HTTP 狀態(tài)碼和錯(cuò)誤提示。不同模塊的異?;ハ喔綦x即使同名也不會(huì)混淆。同時(shí)針對(duì)網(wǎng)絡(luò)調(diào)用、數(shù)據(jù)庫(kù)操作這類可能臨時(shí)失敗的場(chǎng)景我會(huì)定義重試策略。常用的庫(kù)有tenacity可以配置重試次數(shù)、間隔、哪些異??芍卦?。重試只針對(duì)瞬時(shí)故障比如連接超時(shí)、數(shù)據(jù)庫(kù)鎖沖突業(yè)務(wù)邏輯錯(cuò)誤比如余額不足不能重試否則會(huì)造成重復(fù)扣款。5.3 防御式編程與Fail Fast防御式編程不是到處加if判斷而是在“邊界入口”上做防御。我的習(xí)慣是外部輸入、配置值、依賴服務(wù)的返回值這三個(gè)地方必須做校驗(yàn)。內(nèi)部函數(shù)之間相信類型標(biāo)注和測(cè)試不做多余檢查。校驗(yàn)不通過(guò)時(shí)越早暴露越好。我寧可啟動(dòng)時(shí)因?yàn)榕渲脼榭斩罎⒁膊幌胱尫?wù)跑著跑著才在某個(gè)角落報(bào)錯(cuò)。這就是 fail fast 的原則錯(cuò)誤發(fā)生的位置越接近發(fā)生點(diǎn)排查成本越低。再分享一個(gè)細(xì)節(jié)不要用assert做數(shù)據(jù)校驗(yàn)。Python 的assert在運(yùn)行python -O時(shí)會(huì)被禁用線上環(huán)境如果開(kāi)啟了優(yōu)化所有斷言都會(huì)失效。我在老項(xiàng)目里見(jiàn)過(guò)一堆a(bǔ)ssert校驗(yàn)前端傳參結(jié)果某人加了優(yōu)化選項(xiàng)發(fā)布線上直接失去了校驗(yàn)?zāi)芰髁朔欠▍?shù)也沒(méi)人攔。所以只有開(kāi)發(fā)者自測(cè)時(shí)可以用 assert對(duì)外輸入校驗(yàn)必須用顯式的 if raise。6. 函數(shù)式抽象與依賴注入解耦的思維練習(xí)6.1 全局變量和隱式依賴的壞味道我見(jiàn)過(guò)最讓人頭疼的代碼是函數(shù)內(nèi)部直接引用全局變量比如config load_config() def process(): timezone config[timezone] return ...如果哪天config變了或者沒(méi)有全局定義這個(gè)函數(shù)就會(huì)莫名其妙地失敗。更麻煩的是測(cè)試要為這個(gè)函數(shù)準(zhǔn)備環(huán)境得先設(shè)置全局變量但pytest里全局變量的作用域很容易互相污染一組用例跑完另一組拿到的是殘留狀態(tài)。我后來(lái)學(xué)會(huì)一個(gè)判斷標(biāo)準(zhǔn)如果函數(shù)離開(kāi)“全局環(huán)境”就跑不起來(lái)說(shuō)明它有隱式依賴。隱式依賴越多代碼就越難理解、越難測(cè)試、越難復(fù)用。6.2 依賴注入的輕量實(shí)現(xiàn)依賴注入聽(tīng)起來(lái)很高大上但 Python 里根本不需要框架。最簡(jiǎn)單的做法就是通過(guò)函數(shù)參數(shù)傳依賴def fetch_user(user_id: int, db: Database) - User: ...測(cè)試的時(shí)候傳一個(gè) mock 的db就行。不需要 singleton不需要 global不需要魔法。這個(gè)簡(jiǎn)單習(xí)慣能解決 90% 的耦合問(wèn)題。有人會(huì)說(shuō)“每個(gè)調(diào)用點(diǎn)都要傳 db太麻煩。”我的回應(yīng)是麻煩一點(diǎn)換來(lái)的是清晰的調(diào)用鏈和可測(cè)試性。如果參數(shù)傳遞過(guò)多可以用一個(gè)Context對(duì)象把這些依賴打包但不建議用一個(gè)萬(wàn)能參數(shù)到處傳。對(duì)于類對(duì)象我通常使用構(gòu)造函數(shù)注入class OrderService: def __init__(self, payment_client: PaymentClient, db: Database): self.payment_client payment_client self.db db這樣寫的好處是每個(gè)類的依賴都在構(gòu)造簽名里清清楚楚團(tuán)隊(duì)里做代碼 review 時(shí)一眼就能看出這個(gè)類依賴了哪些外部服務(wù)方便評(píng)估風(fēng)險(xiǎn)和替換 mock。6.3 抽象接口與實(shí)現(xiàn)分離在 Python 里抽象有兩種方式一種是寫 ABC抽象基類一種是直接用“鴨子類型”只要實(shí)現(xiàn)了同名方法就可以。對(duì)于大型業(yè)務(wù)模塊我傾向于定義接口協(xié)議用typing.Protocol來(lái)表明“這個(gè)模塊需要什么樣的依賴”而不是強(qiáng)制繼承 ABC。舉個(gè)實(shí)際例子某項(xiàng)目里有郵件發(fā)送服務(wù)最開(kāi)始直接用了某個(gè)第三方 SDK 的MailClient到處from mail_sdk import MailClient。后來(lái)要換供應(yīng)商所有引用點(diǎn)都要改。我重構(gòu)時(shí)定義了一個(gè)協(xié)議class MailSender(Protocol): def send(self, to: str, content: str) - bool: ...然后將第三方 SDK 封裝在一個(gè) adapter 類里業(yè)務(wù)模塊只依賴MailSender。換供應(yīng)商時(shí)只需要新增一個(gè) adapter業(yè)務(wù)代碼零改動(dòng)。這樣做的另一層好處是測(cè)試時(shí)只需要 mock 一個(gè)符合MailSender協(xié)議的對(duì)象不需要 mock 任何第三方 SDK 的內(nèi)部結(jié)構(gòu)。抽象隔離了變化也隔離了外部庫(kù)對(duì)我們代碼的污染。心得不要一開(kāi)始就抽象過(guò)度設(shè)計(jì)比重復(fù)代碼更討厭。我通常是在“第二次要用相同邏輯”時(shí)才開(kāi)始提取接口。第一次用完就抽象往往假設(shè)錯(cuò)了方向反而讓結(jié)構(gòu)更亂。7. 代碼審查與自動(dòng)化把習(xí)慣固化成團(tuán)隊(duì)紀(jì)律7.1 代碼審查不是找茬寫好個(gè)人代碼是一回事團(tuán)隊(duì)協(xié)作又是另一回事。我越來(lái)越發(fā)現(xiàn)代碼審查Code Review不是為了揪出誰(shuí)的 bug也不是為了證明誰(shuí)更厲害而是為了“分享上下文”。我在 review 里最想看到的是這段代碼為什么這么寫有沒(méi)有考慮邊界評(píng)論區(qū)里能提出問(wèn)題也能記錄決定。我給自己定了一個(gè) review 清單每次看別人代碼都過(guò)一遍有沒(méi)有裸except、空分支、被靜默吞掉的異常有沒(méi)有配置硬編碼在代碼里有沒(méi)有全局可變狀態(tài)在模塊之間被共享有沒(méi)有函數(shù)做了兩件以上的事新增的依賴能不能避免有沒(méi)有更輕量的方案日志有沒(méi)有帶 trace_id字段結(jié)構(gòu)是否統(tǒng)一測(cè)試是否覆蓋了成功路徑和至少一種失敗路徑這個(gè)清單不在工具里而在腦子里。每次 review 都對(duì)著過(guò)一遍既快又穩(wěn)。時(shí)間久了寫代碼的人也會(huì)自動(dòng)先照這個(gè)清單自查。7.2 用自動(dòng)化工具減少口舌之爭(zhēng)Review 里最浪費(fèi)時(shí)間的是“格式問(wèn)題”和“命名問(wèn)題”。比如有人用單引號(hào)、有人用雙引號(hào)有人 tab 縮進(jìn)、有人空格縮進(jìn)為了這些吵架毫無(wú)價(jià)值。所以我的 CI 里直接集成了一整套自動(dòng)化檢查black統(tǒng)一代碼格式拒絕手工調(diào)格式。isort統(tǒng)一 import 順序。flake8或ruff檢查未使用的變量、重復(fù)定義、潛在語(yǔ)法錯(cuò)誤。mypy靜態(tài)類型檢查。pre-commit在本地 commit 之前就跑一遍上述工具。用pre-commit的最大好處是在代碼進(jìn)入倉(cāng)庫(kù)之前就把低級(jí)問(wèn)題攔住了。CI 里的檢查成了一個(gè)兜底真正需要人看的只有邏輯問(wèn)題。配置pre-commit其實(shí)不復(fù)雜新建一個(gè).pre-commit-config.yaml把black、isort、ruff加進(jìn)去然后pre-commit install即可。團(tuán)隊(duì)統(tǒng)一配置誰(shuí)機(jī)器上跑不過(guò)誰(shuí)就不能提交。剛開(kāi)始大家會(huì)抱怨“麻煩”但跑一周之后沒(méi)人再愿意手工調(diào)格式了。7.3 提交信息與分支規(guī)范提交信息看似無(wú)關(guān)緊要但在回滾和追溯時(shí)特別重要。我堅(jiān)持用 Conventional Commits 風(fēng)格feat: 增加訂單導(dǎo)出功能 fix: 修復(fù)金額精度丟失問(wèn)題 chore: 更新依賴版本 refactor: 重構(gòu)支付模塊的異常處理 ^這個(gè)格式讓git log變得可讀也有人會(huì)用 changelog 自動(dòng)生成版本記錄。但更重要的是分支命名、提交信息要和任務(wù)系統(tǒng)關(guān)聯(lián)起來(lái)。比如分支用feature/order_export提交信息里帶#123這樣的任務(wù)編號(hào)這樣以后查一個(gè)問(wèn)題能直接從 git 記錄跳到任務(wù)上下文甚至翻到當(dāng)初的討論記錄。還有一條鐵律絕不直接向 master/main 推送代碼所有變更都必須通過(guò) Pull Request/Merge Request。這條規(guī)則的背后不是流程潔癖而是為了強(qiáng)制代碼經(jīng)過(guò)至少一次 review 和 CI 檢查。哪怕是你自己的個(gè)人項(xiàng)目我也建議走一遍這個(gè)流程——至少能讓你自己回看一遍。經(jīng)驗(yàn)代碼審查的回復(fù)里盡量用“建議”“可以考慮”“我擔(dān)心”這樣的語(yǔ)氣而不是“你錯(cuò)了”“必須改”。工程協(xié)作本質(zhì)上是在管理風(fēng)險(xiǎn)不是在爭(zhēng)輸贏。好的 review 文化決定了一個(gè)團(tuán)隊(duì)能走多遠(yuǎn)。7 條習(xí)慣講完了都是我這幾年流水線里真刀真槍趟出來(lái)的。寫 Python 容易但把 Python 寫出工程感靠的不是某一個(gè)炫技語(yǔ)法而是這些看似瑣碎的日常約束。我個(gè)人最深的體會(huì)是這些習(xí)慣不是枷鎖而是保護(hù)網(wǎng)。有了類型邊界、結(jié)構(gòu)化日志、單測(cè)兜底和自動(dòng)檢查我反而敢大膽重構(gòu)代碼了——因?yàn)槲抑谰退愀腻e(cuò)了測(cè)試和日志也會(huì)第一時(shí)間告訴我。如果你也剛開(kāi)始帶項(xiàng)目不妨從其中一兩條開(kāi)始推行不用一步到位。少踩一個(gè)坑就是賺到。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91人妻中文| www.超碰| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 超碰在线97国产| 啊啊啊慢点| 成人性爱av| 婷婷五月天激情四射| 人妻素股| 丁香色狠狠色综合久久小说| 男人下部插入女人下部| juliaann欧美丝袜办公室| 亚洲av综合色区无码一| 色九九九综合| 黄色av片三级三级三级免费看| 91色噜噜狠狠| 高潮毛片无遮挡高清免费| 亚洲欧美精品一区天堂久久| 亚洲不雅视频1区二区| 精品超碰国产| 国产97在线 | 亚洲| 天堂无码精品国产久| 91老司机在线视频免费观看| 97免费在线观看| 伊人久久婷婷| 婷婷激情四射| 99精品久久久久久| 99精品在线播放| 天天干1区2区在线| 日本αv| 天天日天天色| 九九久久玖玖| 成人综合视频久久| 免费一级性爱久久| 97爱碰| 国产女人和拘做爰视频 | 伊人久久综合影院| 日韩特一级久久| 国产自偷自拍一区| 极品肉射| 日本一二三高清| 不卡中文字幕aⅴ在线| 性色中出| 国产综合永久精品日韩鬼片| 熟女91网| 婷婷六月天| 搡老女人老91二区| 国产美女激情| 色婷久久| 99re免费视频精品全部| 97chaopenrihan| 色色婷婷丁香| 性爱动态120秒| 精品久久久久久中文字幕视频免费| 十八禁网站在线| 91亚州| 五月天久久婷婷亚洲 | 淫乱图区| 欧美视频在线第3页| 国产性爱强奸乱伦大全| 美国三级日本三级久久99| 久操婷婷| 91丨九色丨国产丨人妻在线 | 思思热在线观看| 色综合加勒比| 欧美综合网1| 婷婷啪啪| 国产欧美一级在线观看| 日韩97P| 大乔未久88一区| 99色在线| 欧美人人AAA| 啪啪综合网| 日本精品人妻少妇一区二区| 免费人成毛片乱码| 久久精品操| 九九热视频这里只有精品| 婷婷影院入口| 岛国在线免费视频| 久久久性爱| 操我啊啊啊啊啊| 免费伦费视频在线观看| 欧美夜夜| 久久久精品,3| 伊香蕉综合久久久久久久噜噜噜| 清清草影| 少妇诱惑视频| 国产久久一区二区午夜| 日本一级二级三级网站| 日韩一性一交一A片俄罗斯 | yazhousetuoumei| 青青草天天亲夜夜操网| 日本精品高清一二区一本到| 九九精品无码专区免费| 欧美少妇人妻| 亚洲久久天堂| 91欧美巨乳| 精品免费1| 丁香五月性| 国语av最新自产拍在线观看| 中文字幕一区二区日韩网| 欧美翘臀视频网站一区二区三区 | 中文精品一区二去| 国产一区二区三区中文字幕| 成人福利视频网| 久久无码一区二区二三区性色| 久久精品国产亚洲粉嫩| 欧美日韩资源| 亚洲熟妇A V黑人| 老鸭窝在线视频播放| 搞中出视频在线观看| 国产不卡精品91| 色婷婷五月天| 亚洲日韩肥臀视频在线观看| 大香樵伊人网| 蜜桃视频精品一区二区| 在线无码操| 色网在线视频观看免费| 国产精品久久久久无码A√| 无码区蜜乳| 97啪啪| 亚洲天堂2020| 欧美日韩传媒| 色网站导航大全| 伊人热综合| 性色综合网| 2017天天操| 综合色欧美| 亚洲国产天堂| 青青色在线观看| 青草综合| 日本免费人成视频播放120秒| 最新无码国产| 欧美一区二区三区四区综合| 精品性爱一区二区| 国内精品伊人久久久久影院会| 亚洲精品天堂久久A∨51成人漫| 色色网91| 亚洲人妻中文高清| 亚洲AV无码乱码在线观看性色| 日本日逼高清| 精品久久久久av影院| 日韩欧美综合激情| 成人午夜视频免费播放| 猛交交| 大香蕉伊人亚洲| 国产天天看| 超碰人妻中文在线| 九九热只有精品| 久久久久久久| 久操网视频| 午夜男人一级A片7777| 偷窥自拍A片| 长长久久曰曰夜夜成人网| 九久9热| 蜜屁Av| 亚洲日本激情| 久久人人舔人人爽舔人人av片| 蜜乳Av成人片网站| 香蕉久久国产AV一区二区| 性爱久久| 国产熟妇一区二区| 久久久月天| 欧美极品| 亚洲一欧洲中文字幕在线| 日韩国产中文字幕| 嗯嗯啊啊用力视频免费| 天天欧美| 韩国黄片aaaa| 免費人妻夜夜爽天天爽爽一区| 97资源站国产精品| 欧美性爱视频免费一区一A| 九九玖玖精品| 2017天天操天天日| 1人人看人人摸人人操| 国产男女无套视频免费观看| 天美一二三在线观看Av| 中文字幕丝袜| 色狠狠 - 百度| 日韩人妻一区二区精品| 久偷拍| 97网色| 久久91视频| 日本淫色网| 麻豆成人av| 91久久久久久久久18| 成人免费福利在线观看| 大香蕉十区| 国产精品乱码久久久久久久久| 乱伦一二三区| 国产精品久久久久久久免牛肉蒲团 | 老司机久久| 超碰色97| 99操| 亚洲欧美日韩中文播放| 视频在线观看一二三区| 亚洲影院无码在线| 国产自产91区13区| 色黄污美女啪啪啪免费网站| 日韩av三四区| 岛国黄片网站| 久久av色| 91精品微拍福利| 丰满精品人妻少妇久久字幕| 北约熟女超碰| 无卡一区=区| 日韩激情啪啪| 国产精品噜噜噜日日日| 91色艳| 中文字幕在线免费观看2| 欧美亚洲国内自拍| 伊人97超碰| 久久精品超碰| 热久久91婷婷| 日本中文字幕不卡视频| 天美传媒在线一区| 国产女人成人精品视频| 欧美亚洲特P| 青草视频在线看看看看看看看看看| 青娱乐黄色录像| 91neishe| 麻豆综合一区av| 夜草欧美| 午夜天堂啪啪| 超碰精品日韩欧美国产| 极品粉嫩少妇视频| 日本一本道A级黄色毛片试看60分钟| 老司机午夜精品福利视频一区二区| xxx0国产在线播放| 日韩本不卡视频在线观看| 欧美日韩m| 五月丁香黄色网| 精品乱码久久久久| 日韩不卡av一二三| 亚洲国产美女久久久久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚洲天堂五月天国产| 久草新免费| 黄片直播三级黄片两女一男| 蜜臀网 一区| 嗯嗯啊啊亚欧精品| 青草视频在线看看看看看看看看看| 欧美亚洲| 日本一卡二区在线| 精品国产污一区二区三区| 91精品国产日韩欧美综合| 疯操AV| 91啪9色| 色综合久久88色综合久久天天| 啊啊啊好大好深| 亚洲日韩av一区二区三区百合| 操逼片国产| 97超碰9| 91 国产丝袜在线播放-百度| 嗯嗯啊啊用力视频免费| 99色在线观看| 26uuu性| 51一区二区三区| 狠狠操综合| 日本一区二区三区四区五区六区七区八区九区| 亚洲AV色图| 国产精品永久免费10000| 五月天色图| 欧美亚洲厕所精品偷拍91 | 欧美gv在线观看| 一,爱啪啪,在线免费视频| 五月丁香啪啪| 欧美激情精品久久久| 综合久久97| 日韩性爱高清免费视频| 东北女人性交| 操高情无码| 欧美 中文字幕 一区| 99少妇| 国产成人精品日本视频| 亚洲国产另类在线中文| 婷婷中文字幕| 中出91视频| 久久社区一区二区三区| 天天日天天射天天干| 青青五月天| 最近的最新的中文字幕视频| 色www精品视频在线观看| AVE乱伦| 婷婷五月影院| 欧美日韩色| 五月丁香久久| 啊啊啊好大好深| 亚洲欧美一区二区三区一猛片| 成人综合视频久久| 国产亚洲日韩欧| 五月天色图| 久久久久国产精品久久久| 99欧美| 校园春色五月天| 日本超碰在线国产一区| 精品九九| 操一区| 影音先锋日本乱伦| 人妻人人澡人人爽人人| www.黄色在线| 亚洲精品蜜桃久久久| 亚洲偷拍自拍在线视频| 丝袜美腿操av| 麻豆人妻精品一区二区| 老司机福利青青草| 麻豆精品天美| 婷婷五月天影院| 亚洲区小说| 日日夜夜天天| 中文精品一区二去| 男人的天堂久久| 精品久久久久久亚洲| 久久超碰网| 一区,二区,三区网站| 另类图片欧美激情综合| 吉川爱美亚洲二区在线| 丁香九月激情啪| 亚洲精品欧洲色| 久久大香蕉手机高清| 人人弄人人摸| 国产久9| 日本三级中国三级99人妇网站| 超碰欧美| 91熟女.com| 一二三区在线| 久久久久久亚洲Av无码| 蜜汁欧美| 亚洲精品美女操逼| 久久不卡一区二区| 婷婷视频在线免费观看| 欧州91高潮| 婷婷15月天青娱乐| 人人澡人人爽人人精品| 欧美日本国产日韩激情视频| 无码人妻1727| 天天日骚逼熟女| 日本熟妇一区二区三区| 操逼片中文| 神马九九| 97国产精选| 操b网站亚洲无码| www.婷婷| 曰韩成人免费视频| 国产91av在线播放| 亚洲欧美在线丝袜| 国产亚热在线久久| 久久久久亚洲一区女同性恋中文字幕| 99色在线| 婷婷中文网| 亚洲h片在线免费观看| 欧美午夜熟妇黑人精品91| 亚洲AV资源| 91九色网| 免费啪啪啪网站18岁| 岛国在线国产| 欧美人黑A片无码免视费| 2019男人的天堂| 加勒比日本在线| 欧美性天天影视| 国产av美女被艹的乱叫| 天堂无码精品国产久| 日本淫乱女一区二区三区视频| 久久久一二三四区| 亚洲骚男同com| 国产精品一区二区后入| 目产99999久久999| 97色论| 人妻插插人妻人| 五月天开心网| 大香樵伊人网| 亚洲情色五月天 | 九九久久首页| 白丝1区2区3区| 久久亚洲影院一区二区| 丁香五月天激情综合| 中文字幕日本久久| 超碰国产在线| 欧美操人| 久久久久成人蜜桃精品| 麻豆精品久久久久久久| 69人妻人人揉人人躁人人精品| 综合婷婷| 色天使大香蕉| 啊啊啊啊啊啊啊啊啊啊在线观看| 双插在线| 少妇内射视频| 91色宗合| 五十路六十路七十路熟婆| 久草精品国产99| 91av一区二区在线观看| 国产午夜激片Av毛片不卡| 韩国午夜理伦三级好看| 777奇米影视777四色| 黄色性爱网网| 久久久A∨| 人妻精品综合中文字幕在线 | 国产嫩草精品A88AV| 人妻丰满熟妇av无码区蜜桃| 久久男人| 久久产精品一区二区三区电影 | 999综合色| 欧美国产操逼| 久草资源在线| 肏逼福利网站| 少妇高潮特黄A片| 日韩欧美经典在线观看| 国产剧情一区在线观看| 久超超碰| yazhououmeizongya| 色九久| 无码久久国产| wwwcaobibi| 性爱动态120秒| 久久男人网| 性色高清..……| 超碰欧美| 日本99热| 爱丝福利| 日本αv| 18禁超污无遮挡无码免费网| 99亚亚热| 久久r精品| 高清无码久操视频| av凤凰久久久| 欧美日韩国产男人| 91亚洲综合在线| 国产性久久久| 爆乳免费黄网站| 欧美一品道| 性色AV网站| 日韩女模中文造逼| 美国三级日本三级久久99| 在线不欧美| 美女自卫慰黄网站免费| 久久999久| 97爱爱| 日韩黄色成人性爱| 精品国产久久乱码| 高清国产精品无码| 中文字幕国产精品1区| 超碰无码五月97| 超碰精品日韩欧美国产| 久操99| 亚洲骚逼少妇| 亚洲一区二区性爱电影| 九九九九九九成人| 99久久亚洲精品无码毛片潘甜甜| 少妇超碰在线| 东北老熟女| 亚洲最新中文字幕免费| 成人在线视频一区| 免费观看网黄| 日韩精品9999| 日韩三A大片在线观看| 天天操av懂色| 97免费视频在线观看| www.激情| 人妻熟妇一区二区三区| www久久99| 色97国产69香蕉| 国产精品久久久久久片| 中文字幕在线2| 免费福利视频中文字幕| 91骚妇| 日韩强奸av| 男人下部插入女人下部 | 一区=区三区视频| 91人妻少妇| 熟女丰满人妻一区| 精品国产乱码久久久久久网站入口| 国产日比| 9久久久久| 国产女人高潮视频| 视频一区二区免费在线| 激情终合网| 亚洲欧洲综合av在线| 超碰在线97国产| 亚洲天堂7777| 欧美激情 亚洲色图| 国产亚洲99久久精品| 国产精品噜噜噜日日日| 91女人的网站| 99热99在线播放激情| 男人的天堂日韩| 1769精品一区二区三区| 国产精品一区二区三区在线| 亚洲日韩一区电影| 国产精品久久久久无码Av网曝门| 影音先锋一区二区在线资源| 亚洲九月丁香| 中文一区二区三区影院| 亚洲欧美精品久| 日韩人成网站在线播放| 97视频免费播放| 成人熟女视频一区二区三区| 人妻 丝袜美腿 中文字幕| 玖玖大干人妻| 亚洲天堂性爱| www.大香| 综合网天天| 中文字幕超碰CAO| 99九九久久| A级片日韩欧美国产欧美视频精选观看| 精品亚洲俞拍视频一区| 国产精品久久久三级无码| 亚洲超碰97| 日韩图区| 日韩精品三区四区| 爱媛媛久久国产福利| 性综合网| 午夜福利一区二区三区四区五区色婷婷| 99啪啪| 超碰国产精品无码| 中文三一区| 性色av一区二区| www.色99| 综合免费无码中文| 超碰97人妻免费在线| 亚洲精品黑丝| 亚洲第一页欧美| 亚洲成av人片色午夜乱码| 俺去啦俺来也久久综合| 天天爱天天操| 麻豆区久久久久亚| 美骚妇av高清在线| 日本超碰在线国产一区| 国产亚洲精品美女久久久m| 久久六六| 亚洲激情视频| 欧美日韩狠狠爱| 午夜精品久久久久久久| 亚州久久9| 欧洲Au麻豆| 亚洲国产第一页综合视频| 日本人人操人人操| 精品亚洲国产成人精品| 久久久精品中文字幕爱豆| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 91 在线亚洲| 在线国产探花| 免费操逼视频下载| 日韩人成网站在线播放| 亚洲第一精品在线视频| 亚洲国产精品成人综合| 视频国产欧美在线播放| 九九九九九精品视频| 精品国产乱码久久久影院| 无码操逼天堂| 岛国不卡超碰护士AV在线播放| 9久久美女首页| 日日AV加勒比| 天美传媒AV国产在线| 国产精品网站www| 97激情97激情| 闷骚老熟女15P| 五月婷婷hd| 91高跟美女在线播放| 蜜桃臀 后入 一区 二区 三区 在线| 91视频国品一二三区| 天天综合91在线| 91亚洲黑人| 久久发布国产伦子伦精品| 少妇二级| 欧美高清性猛交| 蜜臀99999| 色在线69堂| 亚洲另类色综合网站| 色偷偷2020免费视频播放| 久久99干一本高清| 99热在线播放| 内射老妇BBWX0C0CK| 一级成人性爱| 国人欧美精品一区二区| 99色在线| 欧美狠狠鲁| 任你干在线视频| 97在线/亚洲| 七月婷婷综合| 亚洲 自拍偷拍 欧美| 加勒比久久综合网高清| AV九九| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 久草新在线| 黄色成人网久久久久久| 精品少妇人妻av久久免费| 男男H黄动漫啪啪无遮挡网站| 国内精品久久久久影院亚洲| 天天操天天射青青草| 久草热制服丝袜在线观看 | 久热伊人| 台湾大香蕉99热| 99蜜月精品久久| 91 丝袜在线播放| 人人操人人操人人操人人操人人操人人人11.CM | 婷婷伊人綜合中文字幕| 人人综合| 欧美春色| 亚洲日韩美国人妻| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 亚洲色图大香| 男人天堂网手机版婷婷| 日韩欧美日韩| 97最新在线播放视频| 日韩AV中文字幕电影| 91精品少妇搡搡搡| 国产家庭乱伦表演| 久久久久久亚洲精品不卡人乳| 久草新免费| 人妻精品一区二区三区| 久久精品毛片免费不卡| 婷婷伊人一区| 天天欧美| 9999免费精彩视频| 久久同城AV| 欧美狠狠干| 天天躁日日躁AAAXX| 亚洲欧洲无码97久久精品| 玖玖久久久| 92人人操人人| 玖玖草久草99蜜月一区二区三区| 永久电影三级在线观看| 天天操天天插| 免费视频观看60秒| 玖玖爱免费观看视频| 四虎884a| av毛片aaaaa免费看| 日本高清电影欧美色图| 加勒比色99999| 久久久久久久亚洲Av无码| 久久少妇视频| a片久久久久久久久久久久 | 蜜臀99久久国产| 日本一级性爱| 激情文学小说一区二区 | 久久久网一区| 高潮毛片无遮挡高清免费| 啊啊啊啊视频免费| 欧美综合自拍| 伊人97色天使| 一本久道久久综合狠狠爱| 中文字幕二区| 去干网最新版| 天天综合网~91| www.超碰在线| 伊人麻豆传媒| 麻豆 欧美 日韩| 操东北女人| 韩国轻伦国内自拍一区| 视频在线97| 91日本在线观看| 夜夜嗨免费视频| 99热这里只有精品地址| 人人妻人人爽人人精品| 日日爽夜夜爽| 探花精品 一区二区| 偷拍欧美激情| ji熟女.com| 成人在线午夜视频一区| 国产第25页在线观看| 久久精品91| 色婷婷丁香五月| 国产99热| 大香蕉色网| 操操逼操操逼操操逼逼| 亚洲影视第一页| 婷婷丁香六月| 国内毛片欧美香蕉精品| 天天天天做夜夜夜夜做| 网页导航五月天免费一二三区| 欧美综合自拍亚洲综合图| 日本免费亚洲欧美| 大香蕉一级黄色片久久| 日韩啪啪啪视频| 熟妇操花| 亚洲无 码A片在线观看麻豆| 9超碰免费| 亚洲欧美国产其他二区| 九九九九精| 美国久久一二三四| 日韩精品一区的| 蜜臀久久99精品久久久| 偷拍在线观看视频| www.夜夜| 亚州操逼图| 国产精品夜夜| 噜噜噜亚洲精品| 黑丝少妇| 欧美亚洲另类在线蜜桃| 色牛aV| 夜夜操一区二区| 天美精品av| 成人激情无码在线视频| 亚洲激情片| 精彩久久中文| 久久的网站啊啊啊啊啊| 国产一级片| 另类小说综合网| 熟女熟妇一区二区三四区| 1204av韩国| 啊啊啊啊嗯嗯嗯用力好爽| 一线黄色免费性爱片| 国产女人视频三四五区| 97精品久久久久中文字幕| 欧美黄页在线| 国产精品久久久鸭无码的功能| 天天射天天| 超碰色图| 九草九九九| 久久99999| 日韩在线女优天天干| 国产精品99久久久www| 无遮挡一级毛片视频免费的| 久久精品熟妇丰满人妻99| 视频二区熟女人妻| 国产成自自拍在线观看| 九久久九精品视频| 亚洲国产精品久久久久久久久久| 夜色AV无码手机在线影院| 亚洲AV麻豆Aⅴ无码电影一| 五月天婷婷社区| 精品制服美女中文一区二区三区| 97国产天堂岛| 久久久久久久久久久久久久久乱码| 九九碰九九爱97超碰| 熟女人妻一区二区三区| 国产精品美女在线一区| 色操逼网| 欧美一区二区一级岛国大片| 超碰午夜| aV中亚| 天久久久噜噜噜久久国产精品爽爽| 日韩欧美蜜桃精品久久中文字幕久久| 伊人伊人LD| 操b网站亚洲无码| 欧美色图天堂网m| 欧美中文字幕一区| 台湾肥佬网一区二区三区| 欧美日韩另类字幕中文| 91精品国产高清久久久久久,亚洲成人| 婷婷五月激情综合| 色姑娘综合网| 搡老女人老91二区| 99re免费| 免费精品无码一级毛片牛牛影视| 久久精品—区二区三区内射| 人妻欧美| 日本影视久久免费| 久久久久久久久久va| 亚洲无线码欧洲精品区别| 欧洲欧美视频一区二区| 激情五月天插| 国产三级多多影院2022国产AA一级毛片无码 | 精品国产污一区二区三区| 少妇99成人麻豆| 天天摸夜夜摸| 高清肉丝中文无码| 四虎免费在线播放| 97久久超碰日韩精品| 少妇熟女一区二区三区| 操国产高清| 在线人成亚洲视频免费观看| 岛国激情视频在线观看| 欧美大香蕉同搞| 天天干人妇| 麻豆久久久一区二区| 麻豆久久久久久久久丝袜| 青青草在线视频欧美| 欧洲自拍色图gif在线| 极品少妇久久久久| 密乳视频在线| 自拍偷拍 高清无码| 天天躁日日躁AAAXX| 啊啊啊用力在线观看| 中文字幕久久精视频久久大全| 精品无码产区一区二| 男同专区一区二区三区在线| 一级做a爰片性色毛片久久| 国产亚洲精品农村妇女 | 日本不卡在线二区三区| a男人的天堂久久一级A毛片| 国产午夜无码片在线观看影视| 婷婷五月天伊人| 97超碰色屌| 精品久久久一本一道| 五月天婷婷在线看| 欧美亚洲日本激情在线| 亚洲男人天堂2012| 四虎精品亚洲| 欧美一区二区日韩三区| 五月丁香在线| 九七毛片九九毛片| 欧美精品三区| 黄色高清无码无码破解免费暗网 | 亚洲 暴爽 AV人人爽日日碰| 精品亚洲国产成人av网站| 淮穴色AV| 欧美性第1页| 不卡av在线中文字幕| 99热在线观看| 欧美在线|亚洲| 国产av激情无码久久天堂| 超碰九色| 蜜乳av一区二区三区| 欧美日韩大香蕉| 色色综合网站| 亚洲欧美综合网站| 成人无码在线超碰网| julia高潮后不停追击中出| 亚洲日韩欧美一区二区| 国产狂喷潮在线精品| 色色国产| 国产自啪精品视频网站黑丝| 日韩av电影成人在线| 97精品国产97久久久久久| 舔舔啊| 九九精品99| 嗯……啊…嗯嗯…啊…好舒服| 91女日逼| 啊视频在线| 天天爱综合网| 激情网色| 香港日本韩国人妇99www.wccm20| 色综合av综合久久| 91N欧美| 欧美日韩亚洲天堂| 九月丁香| 久久久青青草| 国产免费一区二区在线A片视频| 97国产伦理| 国产精品无码av在线| 三级网站超变态精品| 中国AV美女| 亚洲宗合电影| 成人无码在线超碰网| 少妇与黑人高潮在线| 日B操| av亚洲天堂资源网站| 国产精品久久久久久高清无码免费看| AV色天香在线| 欧美传媒| 国产精品在线网站| 啪啪资源网| 亚洲一区制服诱惑| 国产成人精品亚洲日本| 色九九九九九九| 欧美在线干| 夜夜欧美| 人人色人人射人人妻| 翔田千里A片一区二区| 九九久久国产精品| 中国国产精品一区视频| 久久久久人| 日韩成人综合网| 亚洲激情视频| 久久久久久久久久久久久久久乱码 | 五月丁香社区婷婷日韩欧美精品影院 | 高潮精品| 躁躁日曰躁2020| 成人精品一区二区91毛片不卡| 男人天堂 天天射| 国产精品国产拍高清AV| 精品国产乱码久久久久久蜜臀| 精品四五区| 女同女同恋久久级三级| 亚洲国产福利视频| 午夜精品久久久久久久男人的天堂 | 一级久久久久久久久久久| 91N综合网| 日本天堂网| 大香蕉免费乱伦视频| 91九色丨风韵犹存| www.高清无码诱惑一区.com| 黑人精品成人一区二区三区| 性色aV一区二区三区噜噜| 色色99| 久久精品性| 亚洲精品一二牛牛| 男人天堂最新手机版在线青青草| 国产精品一区人妻精品阁在线| 日韩精品在线视频在线观看| 91精品婷婷国产综合久久| 久久久久久久久久久久久久久性生活视频| 国产精品露脸在线观看| 亚洲一区中文字幕| 欧美久久久15P| 激情综合亚洲| 欧美黄色大片在线观看| 久久超碰日韩精品| 伊人亚洲综合| 九九九久千久久激情蜜桃在线看 | 久久人妻无码毛片A片麻豆| 亚洲日产专区| 黄色av片三级三级三级免费看| 亚洲天堂男人天堂| 舔舔啊| 日韩 欧美 校园一区| 天天爽天天爽| 日本成人电影资源网| 蜜臀无码视频在线观看| 亚洲天在线| 日韩精品人妻中文字有码在线 | 99久久精品无码一区二区毛片免费 | 亚洲 日韩 丝袜 熟女 变态| 亚洲黑人在线| 南澳成人一级片在线播放| 久久婷婷亚洲欧| 99999精品视频| 五月丁香婷婷综合| 国产精品成人蜜臀AV在线| 被窝影院午夜看片无码| 久久精品—区二区三区内射| 一级免费精品| 久操影视| 少妇精品久久久| 欧美狠狠弄| 国产丝袜美女诱惑| 热久久这里只有精品| 亚洲免费人妻在| 国产亚洲中文不卡二区| 欧美 精品国产制服第一页| 一区二区三区不卡视频| 欧美色蜜桃97| 欧美日韩不卡传媒| 91天天爽| 综合网亚洲1| 91色s| 亚洲高清男人天堂| 亚洲日韩XXX| 欧美日韩国产人人| 狠狠躁天天躁日日躁| aaa淫乱视频| 欧美精品久久96人妻无码| 天天干1区2区在线| 人妻精品免费一二三区| 蜜臀在线视频| 亚洲视频中文一区| AAAA欧美日韩| 精品国产无码中文| 日本三级A片网站com| 老司机天天操| 高清国产成人无码| 波多野结衣先锋影音| 亚洲第2页| 爱av免费| 六月激情婷婷| AV 少妇 人妻 偷拍| 丁香激情五月| 久热69九色熟妇97| 蜜臀久久99精品久久久久免费观| 9热9热综合网| 99精品高潮| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 亚洲欧美另类图片| 日韩成年人性爱视频| 一区二区免费电影久久| 久久这里是精品| 中国一区二区亚洲人妻| 亚洲黄色影视| 熟女丝袜视频| 国产少妇高潮| 一本一道久久综合久久| 人人操人人肉久久精品| 久久的免费性爱视频| 日本欧美韩国国产在线| 精品一啪| 婷婷五月天综合网| 大吊色| 国产中文字幕在线观看| 日韩有码专区| 午夜乱轮操逼视频免费看| 欧美熟女操屄| 久久久久成人蜜桃精品| 美女91在线观看| 91老妇女| 自拍内地三级在线观看| 久操网线| 东北夫妻性偷拍| 欧美综合 站| 91色香| 久久精品国产亚洲AV嘿嘿| 激情五月天婷婷| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 色五月av| 神马久久啊啊| 午夜毛片亚洲精品片国产久久久| 国产v片在线免费观看| 韩国一级做A片免费的| 久久久久久久久久久97| 99后入| 天堂v无码免费视频| 少妇高潮对白在线观看| 大香蕉手机在线视频| 蜜臀无码一区二区| 欧美精品精品一区二区| 免费操逼视频下载| 台湾大香蕉99热| 国产精品久久久久婷婷二区次| 免费a级毛片av无码久久精品中文字幕| 色婷网| 97视频www| 欧美日韩国产成人高清| 免费看日产一区二区三区| 四虎884a| 91免费看一区二区三区| 五月婷婷AV| 99精品人人爽| 亚洲码在线中文在线观看| 五月综合久久| 日韩精品资源| 国产女人操逼视频| 超碰在线97国产| 中文AV制服乱伦| 99久久com免费视频′| 天堂网亚洲区手机版| 91爆操视频| 国产地址二三| 大二网站亚洲| 性色avv| 美女久久久久久久久久久| 欧美日韩操逼嗦吊| 亚洲国产精品久久久久婷婷老年| 无码免费在线观看黄色片| 国产一区二区三区中文字幕| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 国产黄片在线免费观看| 中文字幕日韩精品一区二区三区| 久久久久久久97| 亚洲天堂区| 啊啊啊啊好疼| 久久大香蕉| 亚洲综合网91| 激情五月天婷婷| 偷拍盗拍亚洲色图图片| 五月天婷婷色色| 日本欧美不卡| 思思99热| 蜜臀视频网站| 久久久亚洲精品电影免费看| 97视频在线看| 区一在线观看| 免费αV在线视频| 久久綜合很很很| 国产精品亚洲天堂网址| 精品999日本| 国产三级中文有码在线视频| 久久久久久久久久久久欧美日| 极品尤物自安慰| 亚洲乱熟女一区二区| 97久久久| 午夜精品久久一区二区| 九九久久99| av天堂天堂av日韩| 精品女同一区| AV九九| 人人人干干人人干| 一区二区 电影 亚洲| 在线免费观看日韩一区| 久久久久婷婷精品av电影| 大屁股xxxxx| 97超碰中文在线| 91jk色拍| av在线免费一区二区| 性欧美| 麻豆天美国美国产| 男人的天堂午夜av| 久久精品日韩专区免费观看| 色婷婷导航| 亚洲美女AV无码| 伊人网在线观看| 伊人久操| 亚洲图片欧美色| 亚洲欧洲色情高清| 国产乱伦性爱AV| 人妻天天爽天天爽三区| 婷婷美人网| 亚洲九区| 国产精品盗摄 偷窥盗摄| 东北操逼| 日韩亚洲美州欧洲综三区一品在线| 成人无遮挡毛片免费看| 成人精品水蜜桃久久久久久久| 日本在线一二| 亚洲精品尤物yw在线影院| 天天影视91看看| 97爱爱影院| 我爱大香蕉| 久思思热视频在线观看| 视频二区美腿制服人妻欧美| 日韩欧美成人大香蕉| 亚洲一区二区性爱电影| 懂色Av| 91亚洲黄色网| 中国黑人三级片网站上区| 欧美日韩999| 成人麻豆av电影网站| 嗯嗯啊好爽| 中文日韩欧美熟| 天天日日日射| 色综合久久久久| 无码高清国产AV| 人人爱人人乐人人操| 成人情色综合网| 久草毛片电影怡| 好吊色在线观看| 操逼日韩无码| 国模不卡| 中文字幕美女91| 日本久久超碰| 国产精品一二三| 久久99精品国产| 97午夜剧场日韩| 国产成人综合网| 福利色色| 在线色导航| 欧美综合国产精品久久丁香| 亚洲在饯| 亚春色色| av草草在线电影| 亚洲精品美女操逼| 欧美日韩黄色片一区二区三区四区人与兽做爱| 日本岛国黄色网址| 丝袜熟女一区二区三区| 国产对白刺激视频| 中文字幕精品免费一区二区| 亚洲激情视频| 精品人妻少妇| 夜夜国自区| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 视频分类 国内精品| 色综合天天| 国产女同视频在线播放| 欧美福利视频啊啊啊啊| 日本成人在线不卡一区二区三区 | 久久a久久| 天天欧美色| 亚洲情色五月天 | 国产欧美日韩臀| 91色图片| 啊啊好多水| 韩国女主播青草在线| 国产精品经典一卡久久久| 国产精品女同| 久久久9品一区二区三区| 国产欧美伊人| 精品国产自在在线99| 青青草原人妻| 国产老熟女| 狠狠操一区二区| 久久、1234| 中国的操老妇女| 九七人妻在线| 素人伊尹大香蕉免费下载视频| 日本国产二线女色| 综合欧美色图| 91爱| 搡老熟女免费视频| 天天躁日日躁AAAAXXXX国产| 日韩久久.一级黄色片| 日本熟妇人妻中出视频| 国产精品成人在线|