亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

把任何重復(fù)任務(wù)都變成一條CLI命令:CLI-Anything實(shí)踐與思考

把任何重復(fù)任務(wù)都變成一條CLI命令:CLI-Anything實(shí)踐與思考 1. 為什么我決定把所有重復(fù)任務(wù)都改造成CLI工具先講一件小事。上個(gè)月我接手一個(gè)數(shù)據(jù)運(yùn)營(yíng)項(xiàng)目第一天光是把客戶發(fā)來(lái)的Excel表整理成標(biāo)準(zhǔn)格式這個(gè)動(dòng)作就手動(dòng)做了四遍打開WPS篩選空行刪掉合并單元格把日期列改成YYYY-MM-DD另存為CSV再寫段Python把CSV灌進(jìn)數(shù)據(jù)庫(kù)。做完第四遍的時(shí)候我盯著屏幕想如果按這個(gè)頻率重復(fù)一年我得花掉整整兩個(gè)工作日在做這種毫無(wú)技術(shù)含量的事情。那天下午我給自己定了個(gè)規(guī)矩任何需要做第二次的事情就必須有一條命令行能解決它。這其實(shí)就是CLI-Anything這個(gè)思路的起點(diǎn)。CLI-Anything不是什么驚天動(dòng)地的框架它是一套完整的方法論和工具箱核心理念就一句話——把你能想到的任何重復(fù)性工作、任何散落的腳本、任何需要通過(guò)瀏覽器和GUI才能完成的操作全部收斂成一條簡(jiǎn)潔、可復(fù)用、可參數(shù)化的終端命令。這個(gè)思路適合誰(shuí)如果你是一個(gè)經(jīng)常和數(shù)據(jù)打交道的人比如數(shù)據(jù)分析師、后端開發(fā)、運(yùn)維、自動(dòng)化測(cè)試工程師甚至只是每天要批量處理文件、定時(shí)跑腳本、調(diào)用接口查數(shù)據(jù)的普通辦公族你都會(huì)從這套方法論里拿到實(shí)實(shí)在在的東西。和寫一個(gè)完整的帶界面的工具相比CLI的成本極低、學(xué)習(xí)曲線極陡、收益卻立竿見影而且天然適配腳本化、定時(shí)化、流水線化。我在這篇文章里不會(huì)講什么高深理論而是把我從零搭建CLI-Anything這個(gè)CLI框架的全過(guò)程、踩過(guò)的坑、最后沉淀下來(lái)的設(shè)計(jì)思路全部掰開揉碎。你可以直接照著做也可以把它當(dāng)成一個(gè)工具箱遇到類似問(wèn)題就抄一段。2. CLI-Anything的骨架設(shè)計(jì)先想清楚這五件事很多人寫CLI工具的習(xí)慣是寫一個(gè)main.py里面塞一堆if __name__ __main__然后用sys.argv[1]判斷參數(shù)。這種寫法在腳本只有幾十行的時(shí)候沒問(wèn)題但一旦命令多了、參數(shù)復(fù)雜了、要支持配置文件了代碼就會(huì)快速腐爛。我在設(shè)計(jì)CLI-Anything時(shí)第一步不是寫代碼而是把需求拆成五個(gè)必須解決的問(wèn)題命令注冊(cè)、參數(shù)解析、輸出格式化、錯(cuò)誤處理、配置管理。這五個(gè)問(wèn)題每一個(gè)都有成熟方案但把它們組合成一個(gè)順手框架需要一些思考。2.1 命令注冊(cè)機(jī)制為什么用裝飾器而不是字典CLI-Anything的第一個(gè)設(shè)計(jì)決策是命令注冊(cè)方式。我見過(guò)很多框架用字符串到函數(shù)的字典映射比如commands {list: cmd_list}。這在命令少的時(shí)候很直觀但每增加一個(gè)命令就要去改字典、維護(hù)別名、處理沖突而且沒法自動(dòng)生成幫助文檔。我最終選擇了裝飾器注冊(cè)方案。每個(gè)命令函數(shù)只要加上cli.command(namelist, alias[ls], desc列出所有任務(wù))就自動(dòng)完成了注冊(cè)。這樣做的三個(gè)好處新增命令只改一個(gè)文件里的一個(gè)函數(shù)幫助信息可以從裝飾器參數(shù)里自動(dòng)提取命令和函數(shù)的對(duì)應(yīng)關(guān)系一目了然代碼即文檔。裝飾器方案在團(tuán)隊(duì)協(xié)作時(shí)尤其有價(jià)值。新人想加一個(gè)命令不用理解整個(gè)框架的注冊(cè)鏈路只需要照著已有函數(shù)的寫法模仿即可不易出錯(cuò)review代碼時(shí)也能快速定位命令邏輯。# CLI-Anything 核心框架示意 class CLIAnything: def __init__(self, name: str): self.name name self._commands {} def command(self, name: str, aliasNone, desc): def decorator(func): self._commands[name] { func: func, alias: alias or [], desc: desc } if alias: for a in alias: self._commands[a] self._commands[name] return func return decorator def run(self, argv): if len(argv) 1 or argv[0] not in self._commands: print(self.help_text()) return 1 cmd self._commands[argv[0]] return cmd[func](argv[1:])2.2 參數(shù)解析不要讓用戶去猜參數(shù)解析是CLI工具用戶體驗(yàn)的分水嶺。同樣是傳一個(gè)日期參數(shù)設(shè)計(jì)得好的工具支持--start2025-01-01、--start 2025-01-01、-s 2025-01-01三種寫法設(shè)計(jì)得差的工具只認(rèn)python tool.py 20250101這種位置參數(shù)用戶記不住、輸錯(cuò)率高、報(bào)錯(cuò)信息還看不懂。我在CLI-Anything里引入了一套輕量參數(shù)規(guī)則每一個(gè)子命令可以聲明args.flag(name--path, short-p, requiredTrue, typestr, help文件路徑)然后框架自動(dòng)生成解析邏輯。底層其實(shí)封裝的是Python標(biāo)準(zhǔn)庫(kù)argparse但對(duì)外暴露的接口刻意簡(jiǎn)化了。為什么不用click或typer因?yàn)镃LI-Anything的定位是那些想快速把問(wèn)題解決、又不太想引入重型依賴的人argparse和inspect標(biāo)準(zhǔn)庫(kù)完全夠用。參數(shù)設(shè)計(jì)有一個(gè)原則值得記住能提供默認(rèn)值就提供默認(rèn)值能不要求位置參數(shù)就不要求所有可能產(chǎn)生歧義的寫法都要在幫助文檔里寫清楚。命令行工具的每一次摩擦都會(huì)讓用戶放棄它轉(zhuǎn)回手動(dòng)操作。2.3 輸出與錯(cuò)誤處理的三個(gè)層次CLI工具的輸出我把它分成三個(gè)層次信息輸出、結(jié)構(gòu)化輸出、錯(cuò)誤輸出。很多人只做第一層導(dǎo)致工具只能給人看沒法被別的工具調(diào)用。信息輸出用普通print即可。結(jié)構(gòu)化輸出要支持--json和--table兩種模式機(jī)器調(diào)用時(shí)輸出JSON方便解析人眼查看時(shí)輸出對(duì)齊表格方便閱讀。錯(cuò)誤輸出則要統(tǒng)一走stderr并且返回非零退出碼這樣腳本才能捕獲到失敗。舉一個(gè)真實(shí)的反面案例。我曾經(jīng)寫過(guò)一個(gè)批量壓縮圖片的工具壓縮失敗時(shí)只是print(failed)然后繼續(xù)跑退出碼永遠(yuǎn)是0。后來(lái)它被接入定時(shí)任務(wù)連續(xù)失敗三天卻沒有觸發(fā)任何告警直到我手動(dòng)檢查日志才發(fā)現(xiàn)問(wèn)題。從那以后CLI-Anything的錯(cuò)誤處理邏輯變成了硬規(guī)則任何失敗必須寫stderr、必須返回非零退出碼、必須附帶足夠上下文信息。2.4 配置管理環(huán)境變量、配置文件、命令行參數(shù)三層覆蓋CLI工具最容易被忽視的是配置管理。很多工具把所有參數(shù)都暴露在命令行上導(dǎo)致一條命令寫下來(lái)幾百個(gè)字符可讀性極差另一些工具則把所有配置寫死在代碼里換環(huán)境就要改代碼。我采用三層配置方案覆蓋優(yōu)先級(jí)從低到高分別是配置文件、環(huán)境變量、命令行參數(shù)。配置文件用YAML默認(rèn)放在用戶目錄下的.cli_anything.yaml環(huán)境變量用CLI_ANYTHING_前綴命令行參數(shù)權(quán)限最高直接覆蓋前兩層。這樣設(shè)計(jì)的原因是默認(rèn)值寫給初次使用者配置文件寫給常規(guī)使用者命令行參數(shù)寫給臨時(shí)覆蓋場(chǎng)景。關(guān)鍵參數(shù)比如API密鑰、數(shù)據(jù)庫(kù)地址不該寫進(jìn)配置文件應(yīng)優(yōu)先從環(huán)境變量或密鑰管理服務(wù)讀取。這個(gè)設(shè)計(jì)說(shuō)說(shuō)容易但它有一個(gè)隱藏收益接入CI/CD時(shí)可以通過(guò)環(huán)境變量注入絕大多數(shù)動(dòng)態(tài)配置根本不用去改代碼或配置文件這也為后續(xù)的流水線化打好了基礎(chǔ)。3. 用一個(gè)真實(shí)案例走通全流程把Excel對(duì)賬變成一行命令理論說(shuō)再多不如一個(gè)完整的實(shí)操案例。我選擇的需求是Excel對(duì)賬因?yàn)樗趲缀跛泻蛿?shù)據(jù)打交道的崗位都會(huì)出現(xiàn)而且足夠典型涉及文件讀取、數(shù)據(jù)清洗、規(guī)則匹配、結(jié)果輸出、異常處理五個(gè)階段。原始需求是這樣的業(yè)務(wù)方每個(gè)月會(huì)發(fā)來(lái)一個(gè)Excel格式經(jīng)常不統(tǒng)一里面有訂單號(hào)、金額、時(shí)間。財(cái)務(wù)系統(tǒng)里有一份標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)表。我們需要找到兩邊數(shù)據(jù)的差異——哪些訂單在Excel里有但系統(tǒng)里沒有哪些金額對(duì)不上然后輸出一份差異報(bào)告。以前的做法是人工打開Excel用VLOOKUP逐個(gè)核對(duì)一個(gè)月的對(duì)賬要花半天。3.1 需求拆解與邊界定義動(dòng)手寫代碼前我先把需求邊界畫清楚輸入是一個(gè)Excel文件路徑輸出是一份Markdown或CSV格式的差異報(bào)告核心匹配邏輯是訂單號(hào)相同但金額不同和Excel中存在但系統(tǒng)中不存在。其他的比如Excel格式的異常處理、重復(fù)訂單號(hào)的識(shí)別屬于加分項(xiàng)但作為隱性需求先記下來(lái)。這一步特別重要。CLI工具最容易失控的地方就是需求蔓延。如果你一開始就想把智能糾錯(cuò)自動(dòng)生成調(diào)整分錄這些功能都做進(jìn)去工具大概率幾個(gè)月都出不了第一版。我的原則是第一版只解決最痛的點(diǎn)其他需求記錄在--help里等真實(shí)用戶反饋再說(shuō)。3.2 核心代碼實(shí)現(xiàn)核心邏輯分三步讀取Excel和數(shù)據(jù)庫(kù)歸一化字段做兩組比對(duì)。讀取Excel我用pandas.read_excel數(shù)據(jù)庫(kù)用sqlite3標(biāo)準(zhǔn)庫(kù)真實(shí)場(chǎng)景可以換成任何數(shù)據(jù)庫(kù)驅(qū)動(dòng)。字段歸一化的意思是把Excel里的日期從2025/1/1統(tǒng)一成2025-01-01把金額統(tǒng)一成兩位小數(shù)的float把訂單號(hào)統(tǒng)一成字符串去空格。這一步不做的話比對(duì)結(jié)果會(huì)出現(xiàn)大量假陽(yáng)性。# 核心對(duì)賬邏輯 import pandas as pd import sqlite3 def load_data(excel_path: str) - pd.DataFrame: df pd.read_excel(excel_path, dtypestr) # 全部按字符串讀入保留原始格式 df[訂單號(hào)] df[訂單號(hào)].str.strip() df[金額] df[金額].astype(float).round(2) df[日期] pd.to_datetime(df[日期]).dt.strftime(%Y-%m-%d) return df def load_system_data(db_path: str) - pd.DataFrame: conn sqlite3.connect(db_path) df pd.read_sql_query(SELECT order_no, amount, date FROM orders, conn) conn.close() df[訂單號(hào)] df[order_no].str.strip() df[金額] df[amount].astype(float).round(2) df[日期] df[date].astype(str) return df def reconcile(excel_df, system_df): excel_set set(excel_df[訂單號(hào)]) system_set set(system_df[訂單號(hào)]) missing_in_system excel_df[~excel_df[訂單號(hào)].isin(system_set)] both excel_df[excel_df[訂單號(hào)].isin(system_set)] merged both.merge(system_df[[訂單號(hào), 金額]], on訂單號(hào), suffixes(_excel, _system)) amount_diff merged[merged[金額_excel] ! merged[金額_system]] return missing_in_system, amount_diff這段代碼看著簡(jiǎn)單但有一個(gè)經(jīng)驗(yàn)點(diǎn)是很多人踩過(guò)的dtypestr和astype(float)的順序不能顛倒。如果先轉(zhuǎn)float再轉(zhuǎn)str金額會(huì)變成1234.0和數(shù)據(jù)庫(kù)里的1234字符串對(duì)不上產(chǎn)生一堆莫名的差異。我的習(xí)慣是全部數(shù)據(jù)先按字符串讀入各自完成清洗后再在比對(duì)階段轉(zhuǎn)為統(tǒng)一類型。3.3 從腳本到成品三件不能省的小事有了核心邏輯后要把它變成真正能用的CLI工具還有三件事不能省封裝成子命令、增加--output參數(shù)、加入日志與退出碼。封裝成子命令意味著這個(gè)對(duì)賬邏輯在CLI-Anything里注冊(cè)為reconcile命令可以通過(guò)cli-anything reconcile --excel path/to/file.xlsx --db data.db --output diff.csv來(lái)調(diào)用。參數(shù)解析器負(fù)責(zé)校驗(yàn)文件是否存在、輸出目錄是否可寫如果校驗(yàn)失敗工具直接以清晰的報(bào)錯(cuò)信息停住而不是等代碼跑到一半才拋異常。--output參數(shù)給了用戶選擇輸出到終端還是寫入文件。寫入文件時(shí)我默認(rèn)同時(shí)輸出Markdown格式的人讀報(bào)告和CSV格式的機(jī)器讀報(bào)告。Markdown報(bào)告放在同目錄下的diff_report.md方便直接貼到周報(bào)里CSV報(bào)告供后續(xù)腳本繼續(xù)處理。日志方面分了三級(jí)正常流程打印進(jìn)度、數(shù)據(jù)量統(tǒng)計(jì)異常情況打印具體原因和建議動(dòng)作最嚴(yán)重的情況比如文件不存在、數(shù)據(jù)庫(kù)連接失敗打印ERROR: ...并返回退出碼2腳本可以通過(guò)$?判斷成功與否。3.4 實(shí)測(cè)效果對(duì)比這版工具做完后我拿上個(gè)月的真實(shí)數(shù)據(jù)測(cè)試Excel里有約3600條記錄數(shù)據(jù)庫(kù)里有3400條雙方各有約200條對(duì)方?jīng)]有的記錄還有約50條金額對(duì)不上的記錄。整個(gè)對(duì)賬從人工的半天壓縮到了原地執(zhí)行命令的0.8秒。這個(gè)數(shù)字帶來(lái)的實(shí)際改變是巨大的。以前每個(gè)月月底財(cái)務(wù)要預(yù)留半天專門做對(duì)賬現(xiàn)在只需要把月度Excel文件拖進(jìn)指定目錄執(zhí)行一條命令幾分鐘內(nèi)拿到報(bào)告。更重要的是這個(gè)過(guò)程從人工不可重復(fù)變成了每次結(jié)果都可復(fù)現(xiàn)、可審計(jì)——任何人運(yùn)行同一條命令得到的報(bào)告完全一致這就為財(cái)務(wù)審計(jì)和自動(dòng)化留出了空間。4. 把CLI-Anything推向真實(shí)場(chǎng)景數(shù)據(jù)源、流水線與自動(dòng)化第一個(gè)案例跑通后CLI-Anything的價(jià)值自然就延伸出來(lái)了。你不可能只做一個(gè)孤立的命令現(xiàn)實(shí)世界里工具之間是要協(xié)作的。這個(gè)階段我主要做了三件事讓工具能讀真正的數(shù)據(jù)庫(kù)和API、讓多個(gè)命令能串成流水線、讓工具能掛在定時(shí)任務(wù)和CI/CD里。4.1 讓CLI工具讀數(shù)據(jù)庫(kù)而不是讀CSVExcel對(duì)賬只是起點(diǎn)。很快我發(fā)現(xiàn)很多任務(wù)的數(shù)據(jù)源根本不在Excel里而在數(shù)據(jù)庫(kù)里。比如我要定期檢查線上訂單表和日志表的差異或者從支付接口拉取對(duì)賬單。CLI-Anything的做法是為每個(gè)命令提供統(tǒng)一的--db-url參數(shù)支持SQLite、PostgreSQL、MySQL三種數(shù)據(jù)庫(kù)連接串。具體實(shí)現(xiàn)并不復(fù)雜用SQLAlchemy作為統(tǒng)一入口配置好連接池和超時(shí)參數(shù)。這樣做的好處是命令內(nèi)部不需要關(guān)心連接的是哪類數(shù)據(jù)庫(kù)邏輯集中在數(shù)據(jù)清洗和比對(duì)上面。數(shù)據(jù)庫(kù)連接串的傳遞方式我建議走環(huán)境變量而不走命令行參數(shù)否則在ps查看進(jìn)程時(shí)數(shù)據(jù)庫(kù)密碼會(huì)直接暴露。這也是上一節(jié)說(shuō)的配置分層原則的一個(gè)具體應(yīng)用。# 典型調(diào)用示例 export DB_URLpostgresql://readonly_user:****10.0.0.5:5432/orders cli-anything reconcile --excel monthly_202501.xlsx --db-url $DB_URL --output diff.csv4.2 把多個(gè)CLI工具串成一條流水線真正的進(jìn)階是命令的組合。CLI工具如果只支持人手動(dòng)執(zhí)行那么價(jià)值有限如果支持A | B | C這樣的管道式組合就能進(jìn)入自動(dòng)化的工作流。我在CLI-Anything里給每個(gè)命令設(shè)計(jì)了兩個(gè)IO承諾標(biāo)準(zhǔn)輸出支持--json結(jié)構(gòu)化格式所有子命令都從stdin讀取JSON數(shù)組作為輸入?;谶@個(gè)約定你可以做這樣的事# 從數(shù)據(jù)庫(kù)拉取待處理訂單過(guò)濾掉已關(guān)閉的再批量加標(biāo)簽 cli-anything fetch-orders --statusopen | cli-anything filter --fieldstate --notclosed | cli-anything tag --tagnew-order這個(gè)設(shè)計(jì)的靈感來(lái)自Unix哲學(xué)一個(gè)工具做一件事把復(fù)雜任務(wù)拆成多個(gè)工具的協(xié)作。它的副作用是每個(gè)命令都必須保持無(wú)狀態(tài)——不在內(nèi)部保存中間結(jié)果數(shù)據(jù)通過(guò)管道流動(dòng)。這在一開始寫起來(lái)略麻煩但長(zhǎng)期收益很大因?yàn)檎{(diào)試和橫向擴(kuò)展都變得簡(jiǎn)單了。4.3 定時(shí)任務(wù)與CI/CD集成有了可以被管道串聯(lián)的CLI工具下一步自然是定時(shí)化。我用crontab做簡(jiǎn)單的每日巡檢用GitHub Actions做每周的自動(dòng)化報(bào)告生成。這里有一個(gè)關(guān)鍵坑CLI工具在cron里跑和在人手里跑環(huán)境變量、當(dāng)前目錄、PATH都可能不同所以工具本身必須做到不依賴隱式環(huán)境。我的做法是所有路徑參數(shù)都要求顯式傳遞不依賴當(dāng)前目錄日志明確寫入stderr并帶有時(shí)間戳輸出文件名默認(rèn)時(shí)間戳格式防止覆蓋工具啟動(dòng)時(shí)主動(dòng)檢查關(guān)鍵配置項(xiàng)是否缺失缺失就快速失敗。這些設(shè)計(jì)都是為了無(wú)人值守場(chǎng)景。# crontab 示例每個(gè)工作日上午9點(diǎn)自動(dòng)對(duì)賬 0 9 * * 1-5 cd /opt/scripts cli-anything reconcile --excel /data/reports/$(date \%Y\%m\%d).xlsx --db-url $DB_URL --output /data/reports/diff_$(date \%Y\%m\%d).csv /var/log/cli-anything.log 215. 實(shí)操中踩過(guò)的五個(gè)坑寫給準(zhǔn)備動(dòng)手的你CLI工具雖然看起來(lái)簡(jiǎn)單但實(shí)際開發(fā)中有不少隱藏陷阱。我在CLI-Anything的開發(fā)過(guò)程中先后踩過(guò)以下幾類每一個(gè)都花費(fèi)了不少時(shí)間排查寫出來(lái)幫大家避開。5.1 坑一Windows環(huán)境下的編碼地獄CLI工具在macOS和Linux下表現(xiàn)正常換到Windows Terminal里就出現(xiàn)中文亂碼。根因通常是Windows默認(rèn)使用GBK編碼而Python默認(rèn)輸出UTF-8。解決方案是程序啟動(dòng)時(shí)顯式執(zhí)行sys.stdout.reconfigure(encodingutf-8)同時(shí)要求用戶在PowerShell里先執(zhí)行$OutputEncoding [System.Text.Encoding]::UTF8。這個(gè)坑在團(tuán)隊(duì)協(xié)作時(shí)尤其隱蔽。某個(gè)人在Mac上開發(fā)測(cè)試沒問(wèn)題交付給Windows用戶后就一堆亂碼對(duì)方還以為工具壞了。現(xiàn)在我把編碼處理寫進(jìn)了CLI-Anything的啟動(dòng)函數(shù)從根源上杜絕了這個(gè)問(wèn)題。5.2 坑二參數(shù)設(shè)計(jì)過(guò)度靈活反而沒人用剛開始設(shè)計(jì)參數(shù)時(shí)我總想反正容易實(shí)現(xiàn)就多提供幾種寫法。于是一個(gè)命令支持七八個(gè)參數(shù)每個(gè)參數(shù)還有兩三種別名。結(jié)果是幫助文檔接近兩千字用戶看兩行就放棄了最后還是手動(dòng)操作。后來(lái)我砍參數(shù)砍到只剩三個(gè)必填參數(shù)加上兩個(gè)可選的--output和--verbose工具的采用率才真正上來(lái)。參數(shù)設(shè)計(jì)的本質(zhì)是約束而不是方便只有高頻變更的維度才應(yīng)該暴露成參數(shù)其他統(tǒng)統(tǒng)做成合理的默認(rèn)值埋在配置文件里。5.3 坑三測(cè)試缺失導(dǎo)致上線翻車CLI工具看起來(lái)代碼量不大很多人就不寫測(cè)試。我的切身體會(huì)工具越簡(jiǎn)單越應(yīng)該在測(cè)試上花心思因?yàn)槟愕暮诵倪壿嬘脩裘刻於家蕾囁淮屋敵鲥e(cuò)誤可能造成比預(yù)期大得多的連鎖問(wèn)題。CLI-Anything從一開始就要求每個(gè)命令至少包含兩組測(cè)試正常流程測(cè)試和異常流程測(cè)試。異常流程測(cè)試?yán)镏辽俑采w文件不存在字段缺失類型轉(zhuǎn)換失敗三種情況。測(cè)試代碼量可能跟業(yè)務(wù)代碼相當(dāng)?shù)看胃膭?dòng)后跑一遍測(cè)試帶來(lái)的安心感值回票價(jià)。# 測(cè)試示例簡(jiǎn)化版 def test_reconcile_with_missing_file(): runner CliRunner() result runner.invoke(app, [reconcile, --excel, not_exist.xlsx]) assert result.exit_code 2 assert 找不到文件 in result.stderr def test_reconcile_with_amount_diff(tmp_path): # 構(gòu)造兩份有差異的數(shù)據(jù)斷言輸出報(bào)告包含差異 ...5.4 坑四依賴第三方庫(kù)版本把自己綁死我之前做工具時(shí)不加鎖版本直接寫pandas1.0。直到某一天客戶環(huán)境里裝的是pandas 2.0read_excel的行為略有變化導(dǎo)致工具靜默輸出錯(cuò)誤報(bào)告。從那以后所有頂層依賴都要寫明版本區(qū)間并在requirements.txt里鎖定已驗(yàn)證版本且升級(jí)依賴必須跑完整測(cè)試套件。5.5 坑五文檔沒跟上工具等于白做CLI工具最容易被忽略但最影響使用的環(huán)節(jié)是文檔。我見過(guò)非常多工具功能完整、代碼優(yōu)雅但打開--help只看到幾行干巴巴的字符串用戶根本不知道輸入什么。我給CLI-Anything寫了一個(gè)自動(dòng)文檔生成器每一個(gè)命令的裝飾器參數(shù)、參數(shù)規(guī)則、默認(rèn)值會(huì)自動(dòng)生成一份Markdown格式的簡(jiǎn)短說(shuō)明放到docs/commands.md下。同時(shí)每個(gè)命令都強(qiáng)制提供至少一個(gè)示例哪怕只有一行。在使用頻率最高的前三個(gè)命令里我還加上了典型場(chǎng)景幾個(gè)字告訴用戶這個(gè)命令通常解決什么問(wèn)題。6. CLI工具的下一步演進(jìn)從解決問(wèn)題到沉淀平臺(tái)當(dāng)CLI-Anything里面已經(jīng)有十幾個(gè)命令之后我明顯感覺到了量變到質(zhì)變工具本身已經(jīng)不是重點(diǎn)重點(diǎn)是它沉淀下來(lái)的那套可復(fù)用能力。這里我想聊三個(gè)值得繼續(xù)深挖的方向。6.1 讓工具的對(duì)話接口更友好終端工具的一個(gè)麻煩是用戶要記住命令名和參數(shù)名。我現(xiàn)在在做的事情是在CLI-Anything上套一層自然語(yǔ)言轉(zhuǎn)命令的輕量交互輸入對(duì)一下上個(gè)月的賬單工具內(nèi)部把這句話映射到reconcile --excel monthly_latest.xlsx這條命令。這不要求什么高深的AI能力做一個(gè)基于正則和關(guān)鍵詞的規(guī)則引擎就夠解決80%的高頻需求。其實(shí)不少團(tuán)隊(duì)已經(jīng)在做更激進(jìn)的方案直接讓大語(yǔ)言模型理解用戶意圖生成參數(shù)并調(diào)用CLI工具。這本質(zhì)上就是把CLI-Anything當(dāng)作一個(gè)可被AI調(diào)用的動(dòng)作庫(kù)——當(dāng)你的工具命令和參數(shù)足夠規(guī)范時(shí)AI才能準(zhǔn)確調(diào)用它。這反過(guò)來(lái)驗(yàn)證了好的CLI設(shè)計(jì)有多重要。6.2 把CLI工具變成團(tuán)隊(duì)共享的中臺(tái)能力CLI工具不該是某個(gè)人的私人腳本而應(yīng)該成為團(tuán)隊(duì)共享的命令行平臺(tái)。我現(xiàn)在在CLI-Anything里做了一個(gè)命令目錄功能列出所有可用命令、使用頻率、最近更新時(shí)間。任何團(tuán)隊(duì)成員只要安裝這個(gè)包就能看到團(tuán)隊(duì)積累的工具全集——這比藏在各自電腦里的腳本強(qiáng)得多。在這個(gè)方向上的一個(gè)具體實(shí)踐是我把CLI-Anything的包發(fā)布到公司內(nèi)部的私有倉(cāng)庫(kù)通過(guò)一條pip install命令完成安裝然后在doc里告訴大家所有命令見cli-anything --list。發(fā)布之后團(tuán)隊(duì)里其他部門的人開始提交新命令進(jìn)來(lái)工具集合從個(gè)人項(xiàng)目變成了真正的公共基礎(chǔ)設(shè)施。6.3 關(guān)于CLI工具性能的最后一個(gè)提醒最后提醒一點(diǎn)CLI工具的單次執(zhí)行性能無(wú)需過(guò)度優(yōu)化因?yàn)橛脩舾兄蠲黠@的是啟動(dòng)時(shí)間和輸出可讀性。如果你的Python工具啟動(dòng)要兩秒可以考慮用uv或加快啟動(dòng)的方案降低延遲。但如果單次任務(wù)本身要跑幾十秒那瓶頸基本在數(shù)據(jù)讀取和清洗上單獨(dú)優(yōu)化CLI框架本身并沒有意義。我見過(guò)太多人在糾結(jié)0.1秒的解析時(shí)間卻對(duì)底層數(shù)據(jù)讀取的10秒瓶頸視而不見。# 一條命令查看所有已注冊(cè)的命令以及它們最近一次使用時(shí)間 cli-anything stats --command-list --sort-bylast_used7. 幾個(gè)細(xì)節(jié)技巧補(bǔ)充讓你的CLI工具立刻提升一個(gè)檔次文章到這里核心框架和案例都講完了。我再補(bǔ)充幾個(gè)零散但實(shí)用的技巧這些都是我在使用CLI-Anything時(shí)一點(diǎn)點(diǎn)積累起來(lái)的每一個(gè)都能立刻改善使用體驗(yàn)。7.1 進(jìn)度條和日志是兩回事CLI工具處理大批量數(shù)據(jù)時(shí)如果長(zhǎng)時(shí)間無(wú)輸出用戶很容易誤以為程序卡死了。給耗時(shí)操作加上進(jìn)度條是一個(gè)極好的體驗(yàn)優(yōu)化但進(jìn)度條和日志不能混在一起輸出。日志要走stderr進(jìn)度條走stdout且定期刷新——混在一起會(huì)讓管道數(shù)據(jù)被污染破壞機(jī)器可解析性。7.2 善用退出碼表達(dá)錯(cuò)誤類型很多人不知道退出碼本身也是CLI工具接口的一部分。我定了一個(gè)簡(jiǎn)單的規(guī)范0表示成功1表示業(yè)務(wù)邏輯處理失敗比如對(duì)賬有差異、過(guò)濾后無(wú)數(shù)據(jù)2表示參數(shù)或環(huán)境錯(cuò)誤。之所以區(qū)分業(yè)務(wù)失敗和參數(shù)錯(cuò)誤是因?yàn)樽詣?dòng)化腳本可以根據(jù)退出碼決定下一步動(dòng)作——業(yè)務(wù)失敗可能只需要發(fā)告警參數(shù)錯(cuò)誤則意味著要修配置。7.3 為每個(gè)命令保留調(diào)試模式CLI工具在用戶端運(yùn)行和在開發(fā)端運(yùn)行面臨的環(huán)境差異很大。CLI-Anything里每個(gè)命令都支持--debug參數(shù)開啟后會(huì)在命令開頭打印環(huán)境信息Python版本、平臺(tái)、關(guān)鍵配置項(xiàng)并在執(zhí)行完成后打印耗時(shí)統(tǒng)計(jì)。用戶報(bào)bug時(shí)直接讓他跑一遍--debug很多問(wèn)題不用我親自復(fù)現(xiàn)就能定位。7.4 用--dry-run讓危險(xiǎn)命令有后悔藥批量刪除、批量修改這類破壞性命令在真正執(zhí)行前先讓用戶看一遍將要做什么是非常重要的。CLI-Anything的規(guī)范是破壞性命令必須實(shí)現(xiàn)--dry-run參數(shù)默認(rèn)值甚至可以是只打印不執(zhí)行用戶顯式傳--force才真正動(dòng)手。這個(gè)設(shè)計(jì)救了我好幾次——有一次--dry-run顯示要?jiǎng)h除的記錄數(shù)量遠(yuǎn)超預(yù)期仔細(xì)檢查才發(fā)現(xiàn)是過(guò)濾條件寫錯(cuò)了一位。7.5 保持向后兼容但用棄用警告引導(dǎo)遷移CLI工具一旦用了就別輕易改接口但完全不動(dòng)也不行。我之前改過(guò)一個(gè)命令的參數(shù)名結(jié)果接在自動(dòng)化流水線里的腳本靜默失敗了?,F(xiàn)在我的做法是舊參數(shù)保留但每次調(diào)用都在stderr打一行棄用警告提示新參數(shù)的寫法并在文檔里標(biāo)注預(yù)計(jì)移除版本。這樣既給了用戶緩沖期也讓工具始終在向前演進(jìn)。8. 最后的建議從今天開始把下一個(gè)重復(fù)勞動(dòng)變成命令這篇文章從CLI-Anything的設(shè)計(jì)動(dòng)機(jī)開始講述了命令注冊(cè)、參數(shù)解析、配置管理、輸出錯(cuò)誤處理等骨架設(shè)計(jì)用一個(gè)Excel對(duì)賬的完整案例走通了從腳本到CLI的改造流程又延伸到流水線、定時(shí)任務(wù)、團(tuán)隊(duì)共享平臺(tái)這些進(jìn)階方向。最后分享的五個(gè)坑和五個(gè)細(xì)節(jié)技巧都是我自己真金白銀換來(lái)的經(jīng)驗(yàn)。如果你讀完只記得一件事我希望是這句話任何做過(guò)兩次以上的事情都值得一條命令把它自動(dòng)化掉。CLI-Anything本質(zhì)上不是某個(gè)具體工具而是一種思維方式——把重復(fù)交給程序把自己從機(jī)械勞動(dòng)里解放出來(lái)去做那些真正需要判斷力和創(chuàng)造力的工作。根據(jù)我個(gè)人經(jīng)驗(yàn)最好的切入點(diǎn)是去找那個(gè)你每周都會(huì)做、但每次都要花半小時(shí)以上的手工任務(wù)。它可能是一個(gè)Excel整理、一組文件重命名、一次接口數(shù)據(jù)比對(duì)那么現(xiàn)在就可以打開編輯器用CLI-Anything的思想把這個(gè)任務(wù)變成你的第一條命令。不要試圖一開始就做一個(gè)完美的大框架。CLI工具的魅力就在于它是被使用逼出來(lái)的命令跟著真實(shí)需求長(zhǎng)出來(lái)——今天加一個(gè)fetch-orders明天加一個(gè)bulk-tag半年之后回頭看你會(huì)驚訝于自己已經(jīng)擁有一套順手的工作流了。這就是CLI-Anything帶給我的最大改變那些瑣碎的、重復(fù)的、讓人疲憊的操作終于都變成了我手中的一條條命令。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色爽——AV| 亚洲第一精品在线视频| 精品亚洲俞拍视频一区| 日韩av不卡在线观看| 四虎影视国产精品| 超碰激情808| 国产亚洲精品美女久久久| 性色高清..……| 欧美黑人猛交春色影视大全| 久久综合九九| 极品尤物在线观看| 久久五十路熟女人妻| 亚洲一区二区av| 国产精品 午夜福利| 99热日本| 国产69精品久久久久99尤物| 搞中出久久| 无码天堂| 日本三级A片网站com| 国产精品伦理| 色777999综合| 狠操91,com| 激激五月| 综合色图区| 免费综合亚洲中文| 美国一区二区三区视频| 亚洲无码精品AV久久久| 亚州性色| 男人天堂新| 日日骚网站| 99精品丰满人妻无码| 色眯眯av| 国产精品在线一区二区| 人妻内射一区二区在线视频| 久草这里只有精品| 伊人操你| 老熟女乱伦一区| 亚洲一级黄色毛片| 欧美97| 2024年最新色情网站在线观看| 麻豆av一区二区| 果冻传媒A片一二三区| 午夜后入| 久久风骚城市| 欧美大的香蕉有线电视视频| 91中文字幕制服丝袜免费视频| 天天综合网亚洲综合网| 91无摭挡| 青女偷拍网| 久久线上视频免费看| 人妻少妇久久| 国产伊人精品在线| 丰满人妻一区二区三区蜜桃视频| 97碰碰色| 黑人娇小av在线播放| 天天综合中文字幕 91| 秋霞色色影院| 国产对白刺激视频| 色成人Www精品永久观看| 日本三级R| 亚洲成A∨人影院在线欢看| 久干9操| 伊人激情五月天一区二区| 日韩人妻播放| 欧美老妇女内射网址| 色色99| 午夜精品久久久久| 91精品国产91久久久久久久久久久久| 91免费看一区二区三区| 欧美刺激色黄片免费看| 天天操av懂色| 日韩99999| 青草成人免费视频一com| 欧美日韩色综合网| 国产大片精久久久久久| 亚洲日韩国产精品| 国产精品免费美女视频| 久久一区二区加油站| 51一区二区三区| 操国产高清| 久久久久久亚洲Av无码| 色综合色欲色综合色综合色综合| 富二代亚洲精品99| 亚洲,欧美,综合网| 亚洲啪AⅤ永久无码| 啪啪免费| 无码人妻丰满熟妇奶水区毛片| 天天综合网~91入口| 999久久久久久久久| 永久免费观看的毛片的网站| 亚洲天堂人妻熟妇视频| 超碰在线974| 蜜桃臀久久| dy888午夜老子影视达达兔| 欧洲成人性爱视频| 自拍盗摄一区| 蜜臀久久99精品久久久久久婷婷 | 水滴偷拍| 欧美十八禁导航成人| 97色色色| 91人妻人人澡人人爽人人精品| 中国AAAAAA黄色片| 国产伦精品一区二区三区视频女| 天美传媒av 在线| 成人在线永久| 国产无码一二三区| av在线免费一区二区| 中文字幕一二区二三区人妻专区| 中文字幕一区二区三区四区在线视频| 欧美色狠| 立川理惠被中出无码| 伊人九九九| 一二三四区操操Av| 91操熟女视频 | 美女午夜福利免费视频| 亚洲图片色图欧美另类| 国产一级特黄大片处女| 久久性爱网站| 日本熟妇人妻中出视频| 秋霞曰韩R级| 殴美大黄片| 日韩人成网站在线播放| 欧美日韩国内不卡| 亚洲成人网站在线观看| 亚洲最大的黄色电影网站。| av亚洲天堂资源网站| 天堂日本亚洲欧美| 蜜臀久久久国产| 国产精品一级二级在线| 亚洲Av诱惑| 日韩兔费看黄片| 超碰色综合| 精品少妇999| 日韩性爱啪啪视频| 1024人妻熟女一区二区三区| 乱老女人一区二区视频| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 伊人少妇久久久| 欧美色图自拍| 天天噜| 淫荡网址| 日本123区操B视频| 高凊专区人人操| 91热情品| 97亚洲综合| 日本十八禁免费看污网站| 一区二区三区四区免费视频| 人妻久热在线| 性色aV一区二区三区噜噜| 久久精品国产亚洲妲己影视| 无码乱人伦中文视频| 丁香五月天啪啪| 日本一区二区三区精品| 亚州欧美综合| 亚洲欧洲成人在线电影| 久久久五月天| 欧美色图成人网一区二区 | 亚州色图第三区| 精品国产污一区二区三区| 在线亚洲丝袜视频网站| 操碰97| 乱伦Av网| 久妇网| 久久精品91| av影片在线观看不卡| 东北丰满熟女国产一区| 啊啊好多水| 亚洲男人天堂手机版| 啪啪啪东京| 亚洲精品丝袜-不卡成人免费……| 97在线观看免费视频l| 五月情色天| 手机在线人成免费视频| 操一区| 天天综合97| 亚洲精品中文字幕一区在线视频 | 国内精品久久久久影院亚洲| 国产情色在线| 亚洲国产ⅴ高清在线观看| 熟女人妻av在线资源,黄色的资源| 使劲用力艹少妇视频一区二区| 1区2区3区视频| 国产精品岛国片在线观看| 97 国产一区| 国产伊人精品在线| 一区在线国产播放| 国产免费一区| 97人妻免费中文字幕| 按摩中文字幕| 亚洲日韩国产精品| 日本超碰在线国产一区| 亚洲欧美在线丝袜| 久久九九综合| 老熟乱一区二区三区四区| 一二三四视频中文字幕在线看| 五月天偷拍| 九九九草| 97干在线视频| 91亚洲黄色网| 五月天成人综合| 九九九九免费高| 黄片国产精品一区二区| 久久超碰、| 男女性无套 免费九一| 乱伦av麻豆| 久久久久久91香蕉国产| 日韩啪啪视频| 色色99| 亚洲精品九九九| 曰韩无码777| 后入日本1234| 99热这里是精品| 久久久极品| 91精品伊人久久久大香线蕉91| 九一性生活免费视频| 91人妻最真实刺激绿帽| 亚洲日韩熟女人妻高清在线| 一级久久久久久久久久久| 欧洲自拍第一页| 亚洲九月丁香| 免费AV中文网在线观看| 人妻天天爽夜夜爽爽| 91在线免费精品视频| 久久天天摸| 国产精品福利资源在线尤物| 日本加靬比网站发布页| 女人喷水视频在线观看| 蜜臀一二三| 图片区小说区| 亚洲无 码A片在线观看麻豆| 91人妻丝袜无码| 操逼视频国产无套| 久久大陆| 99精品在线观看| 鸥美中出| 欧洲精品久久| 国产白嫩漂亮KTV在线| 大香蕉青青9| 依人大香蕉| 色香AV| 嗯嗯啊啊好疼| 国产热RE99久久6国产精品首| 99超碰网| 中文字幕视频2区| 国产一级作爱毛片| 大色综合| 乱人乱色一区二区三区免费| 精品久久久中文字幕不| 国产h片在线观看视频| 欧美综合中文| 大香蕉伊人网WWWn0n| 99久久久久久亚洲精品不卡| 自拍啪啪视频| 国产传媒美日韩av| 国产成人网| 国产欧美在线观看免费观看| 91美女高潮| 婷婷色五月激情| 国产又色又粗又黄又爽| 大逼色网站| 91性生活久久久| 两性色网| 国产精品女aA片爽爽视频| 国产性爱欧美性爱在线| 日本天堂网| 影音先锋中文字幕日本好一区二区| 丰满人妻一区二区三区免费 | 五月天色图| www久久国产精品| 久九九九九九九九热| 久久久久七视频| 超碰人人干| 欧美一区二区三区互相| 思思热一热婷婷热一热| 中文无线日韩一区| 性色高清在线| 国产少妇与亚洲av| 伊人网av| 麻豆天美电影一区二区| 色999;丁香五月| 欧美日韩另类在线播放| 碰碰97| 曰本特级特黄特色黄色A级网站高清在线免费看| 三级三级三级日本99| 女人喷水视频在线观看| 亚洲色图尤物视频| 久久草草亚洲蜜桃臀| 91大香蕉伊人| 亚洲麻豆18发?| 欧美超碰人妻97| 久久99手机免费视频| 亚洲欧洲小说图片视频 | 老司机深夜18禁污污网站| 91综合网在线| 久久 精品| 久久久久久九九九九九 | 97精彩视频网站| 亚洲久热| www老逼91| 这里有精品| 狼人久草| 六九九九| 欧美黄色图片| 97爱b| 佐山爱中文字幕| 动漫片子网站3黄| 日韩国产品视频中文字| 亚洲欧洲无码97久久精品| 人妻在线臀日韩| 免费人人搞97| 奸色色 男人天堂 天天射| 激情久久久| 亚洲黑丝在线| 亚洲天堂性爱| 亚洲91网站| 久久久久9999精品九九九| 欧美aⅴ99久久黑人专区| 人妻 欧美 中文| 色爽——AV| 人妻熟女一区二区| 啪啪啪男女亚洲中文字幕99| 亚洲国产另类在线中文| 中文字幕日韩电影人妻| 99久久精品无码一区二区| 啪啪AV导航| 大香蕉五月天| 超碰97欧美在线| 真实高潮91| 蜜桃色院一区久久 | 男人天堂婷婷五月天校园春色| 天天综合亚在线| 久久久久久91香蕉国产| 九九九热精品| 欧美性爽xyxOOOO| 91人妻精华帖| 91九九| 色女女女导航| 久久久久无码一妻区| 欧美丝袜亚洲| 一本色道无码DVD中文字幕| 91在线视频观看国产| 亚洲aV性爱| 一区二区三区 丝袜 高跟 美腿| 91大神电影天堂| 后入福利视频| 久久伊人最新网址视频| 国产午夜激片Av毛片不卡| 99色| 校园春色宗合网| 天天综合中文字幕 91| 精品蜜乳AV免费观看| 成人日本视频人妻在线| 美女91在线观看| 97久久超碰国产精品| 精品人妻一区二区三区在线视频不卡| 亚洲第一狼人丝袜美女另类| 啊啊啊 在线观看| 色香在线| 国内亚洲高清无码| 99久久久久| 双插在线| 91天天综合日韩欧美| 青青久久手机线视频| 日韩人妻少妇 一区二区三区| 欧美97日韩| 神马麻豆福利院| 久干9操| 亚洲s在线观看| 97在线/亚洲| 一本一道波多野毛片中文在线| 丁香五月天堂网| 免费97视频| 欧美中出| 在线啊啊啊啊| 91bbb| 美女黄频a美女大全免费皮| 欧美A√综合网 | 天天躁狠狠躁av| 欧美高清18A片| 婷婷精品| 精品大全99999| 国产对白刺激视频| 欧美性,色九九| 91国模| 婷婷五月天激情四射| 韩国国产欧美情侣视频在线| 天天射天天操天天干天天吃2018 | 张柏芝国产一区在线观看| 在线另类| 怡红院久久老司机| 在线99热| 97操97干| 717影院理论午夜伦八戒| 亚洲情色在线| 91成人久久| 少妇精品久久久| 免费观看性欧美一级| 大香蕉欧美伊| 日韩精品字幕| 欧美A√综合网| 亚洲一级黄色毛片| 综合激情97| 黄片qw| 亚洲 图片 欧美 色图| 中国AAAAAA黄色片| 久久精品国产99国产精品亚洲| 亚洲成人精品在线一区| 蜜桃精品一区二区三区ww| 久久精品一区二区一8| 国产乱婷婷精品二区三区| 国产剧情在线| 亚洲人妻熟妇三十三区| 国产精品美女久久久久AⅤ国产馆| 老女人老91妇女老热女| 97超碰人人模人人拍人人| 嗯啊不要在线观看嗯啊| 国产中出内射一区二区| 97色冈| 一级成人性爱| 综合九九| 小少妇| AA级电影三区| 亚洲色悠悠久久88| 大香蕉五月天婷婷| 老司机福利青青草| 欧美情色男人的天堂| ..日韩av毛片精品久久久| 东北操逼| 久久超碰爱| 97视频在线免费观看| 欧美色66| a在线观看| 久久神马| 久久久少妇诱惑精品视频| 婷婷97| 成人av性爱电影在线观看| 亚洲欧洲色情高清| 色99在线| 色哟哟511老熟女| 久久有码视频| 九九九九九用不成了| 乳欲人妻办公室奶水| 91制服丝袜中文字幕| 大香蕉123| 国产精品久久久久久久AV大片| 91视频女生| 激激五月| 国产呦精品一区二区三区下载| 快灬快灬 一下爽蜜桃在线观看| 丝袜综合色图| www.狠狠| 国产操偷| 国产精品一区av在线| 男人天堂毛片| 天综合网欧美| 国模吧 一区二区三区| AAAA级日本片免费视频| 欧美色97| 肉丝无码中文高清| 久久有碼| 九色97| 亚洲欧洲国产综合av| 自拍内地三级在线观看| 天天色综合影视网| 国产自产22区| 精品九九淫乱男| 肥臀熟女福利视频一区二区| 久久激情五月| 午夜欧美女人操逼| 欧美日产国产在线成人第一区| 欧美草草高清日韩视频| 国产欧美日产一区二区三区 - 国产欧美日 | 欧美综合自拍亚洲综合图| 热久久九九热| 97舔舔| 婷婷综合在线| 五月婷婷丁香中文字幕| 久久东京伊人一本到鬼色| 日韩熟女无码| 综合网欧美| 密臀视频三区免费网站| 亚洲精品国产拍免费91在线| 久久久一区二区| 国产人妻精品久久久一区二区三区| 亚州AV无码国产精品| 日韩国产欧美伦理在线| 老熟女乱伦片| 国产福利一区二| 日韩一级二级三级在线不卡观看完整| 欧美丝袜中文字幕07在线| 中出人妻中文字幕91在线| 超碰97首页| 一区二区亚州激情久婷婷欧美| 97免费视频网| 久久久久921| 色悠久久久av| 精品妇操一区二区三区| 久久成人午夜狠狠| 蜜臀无码一区二区| 九九九九九九综合| 亚洲日韩精品一区二区| 中国熟妇| 男女性无套 免费九一| 久久夜夜| 樱花蜜乳av| 国产亚洲精品农村妇女| 人妻系列无码专区中文有码| 国产三级电影免费观看| 人人色人人操在线| 亚 欧 美 综合| 密臀在线免费观看| 久干网| 久久久久久中文| 亚洲第一页综合在线| 丰满人妻-区二区三区免费看 | 综合97亚洲| 久久久久久9999| 九九人妻| 无码久久国产| 玖玖玖玖精品国产剧情| 成人在线日韩| 免费观看欧美日韩操逼视频| yirendaxiangjiashipin| 中文字幕78| 欧美激情黑人| 蜜臀久久99精品久久久久久无删减 | 精品久热| 久久久久久九九九九-美女久久久久久久-成人AV| 人人爽夜夜操| 亚洲影视第一页| 嗯嗯嗯,草死我| 一二三区精品视频| 国产精品久久久久久久久久久久久久久| 亚洲精品国产AV天美传媒| 中文字幕久久精视频久久大全| 中文字幕免费看| 91熟女视频网| 美女天天干| 日本国产欧美高清在线| 精品视频日日夜夜| 97欧美色综合| 日本熟女不卡视频| 九色视频91| 在线 亚洲 网爆 自拍| 在线五区| 五码视频在线观看| www.久久爱| 超碰碰97| 国产乱子伦久久精品综合一区二区三| 逼操网站| 亚洲熟女乱色| 骚女天天综合网| 操迟操逼在巾线Fre看| 男人的天堂2019AV| 熟妇女伦乱视频视频| 免费精品国偷自产在线在线| 激情AV| 999 久久久| 国内偷拍精品一区二区| 五月激情天| 亚洲精品人伦一区二区| 亚洲黄色视频在线观看视频| 99精品久久| 97超碰免费生活| 国内精品久久人妻性色av| 久久婷婷五月综合| 亚春色色| 国产一国产一级毛片古装| 偷窥自拍亚洲天堂网爆| 亚洲麻豆18发?| 国产狂喷潮在线精品| 操狠狠| 九九九国产| 人人射人人操人人摸| 日本999精品| 超碰午夜| 中文字幕视频2区| 超碰2017| 天天色粽合合合合合合合| 亚州黄站| 国产伦精品一区二区三区在线观| 天天操天天日天天干| 8x福利精品第一福利视频导航| www.狠狠干.coom | 91老熟女逼| 人妻久久一区二区三区 | 久久久久久网址| 国产av白丝| 久久超碰日韩精品| 欧美日韩99精品麻豆传媒| 亚洲资源一区| 67914亚洲精品| 少妇熟女一区二区三区| 深爱五月婷婷| 亚洲精品99999| oumeisetu综合| 九九碰九九爱97超| 嗯嗯,啊啊,国产精品| 超碰97欧美| 蜜桃久久久久久久| 神马久久久久久伦理片| 熟女一区二区三区| 色青青久久影视| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 午夜欧美神马久久久久| 777AV电影| 性欧美| 成人丁香五月| 思思久热在线精品66| 欧美色图私拍91| 欧美激情性久久久久久| 91女优在线观看| 久久黄片国产一区二区| 欧美色色人| 亚洲av无码成人精品国产| 日韩天天综合| 日本三级人妻a人妻一在线| 无码高清少妇久久| 久久久久久久综合,国产| 九月丁香| 色综合91好| 曰韩欧美国产传媒麻豆第一区| 26uuu国产亚洲综合| 亚洲视频二区 | 亚州AV无码国产精品| 东京男人天堂| 精品久久久久黄少妇| 天堂无码精品国产久| 怡春院久久| 超碰97男人| 操屄不卡视频| 国产精品九九九| 一区二区三区色综合| 午夜啪啪片| 九热中文字幕| 天天舔天天日天天射| 亚洲日韩国产欧美综合v| 欧美资源| 久久久少妇诱惑精品视频| 啪啪啪大香蕉| 97精品熟女少妇一区 | 人妻出轨一区二区三区| 日韩激情啪啪| 澳门黄片一香蕉视频| 91成人在线| 午夜福利无毒不卡| 亚洲区 欧美区| 亚洲天堂性爱| www激情| 韩日性爱av| 99re99| 国产精品乱码久久久久久久| 中文字幕天天天天天| 国产精品久久久久久久久AV大片| 亚洲 欧美 精品专区 极品| 国产又长又大又粗的视频| 日本淫色网| 婷婷色综合| 综合操逼| 国产精品分类在线观看| 色五月AV| 日日97| 四虎影视永久在线观看精品免费网站| 97色97好| 国产黄a三级三级三级av在线看| 亚洲最大网站av| 亚洲无码国产精品久久| 99人妻| 伊人九九九| 日日干日日摸| 国偷自 一区二区| 欧美色图下一页| 91色五月俺来也| 日本大片日本一区二区免费高清 | 久伊人网78| 欧美 熟女 日韩| 久久偷拍人| 人妻精品综合中文字幕在线 | 日本1区2区不卡视频| 精品97久久| 久久久久久久| 伦理第一页| 0755午夜福利视频| 青青草公开在线免费不卡视频| 牛牛久久国产精品视频一二三| 91 丝袜在线| 台湾肥佬网一区二区三区| 99色悠悠| 精爱久久| 91处女视频在线观看| 欧美成人亚洲精品| 大香伊人在线一区| 9久精品视频在线观看| 秋霞男人网| 久久鲁夜| 91N综合网在线| 91精品久久久久久77777| 亚洲少妇激情一区二区三区| 人妻 欧美亚洲| 激情婷婷丁香网| 亚洲小说视频| 国产一级高清免费观看| 97超碰人人操人人操| 亚洲成人精品在线一区| 亚洲免费成人在线高清无码视频| 国产一级137片内射麻豆| 超97在线精品视频| 影音先锋国产精品| 亚洲男人天堂2019| 成人综合视频久久| 美女让帅哥通她小鸡鸡| 人妻少妇久久| 精品传媒在线一区| 乱伦一二三区| 操逼不卡中文字幕| 久久婷五月| 97操97色| 天天干人妻| 久久精品操| 午夜性生活av免费在线看| 日本孕妇一区二区视频操逼免费看 | 欧美亚洲综合色| 艳美熟妇先锋一二三区| 婷婷香网站| 日韩日韩日韩-国产乱码精品一区二区| 91美| 中文字幕一二区二三区人妻专区| www.色婷婷色综合| 久久草大香蕉| 九九玖玖精品| 麻豆一区在线| 青青草华人在线欧美在线| 四虎影视精品| 欧美日韩不卡a片| 97五月天| 欧美日韩大陆黑人少妇99| 校园春色AV天堂| 激情五月天插| 天天躁日日躁AAAXX| 96AV久久久| 欧美少妇高潮视频| 亚洲人妻中文在线视频| 亚洲一区二区精品福利| 人妻在线臀日韩| 国产精品乱码久久久、久久| yiqicaoav| 中文字幕在线观看二区三区| 99re6久热只有精品6在线直播| 男人的天堂久久狠| 永久电影三级在线观看| 国产精品自在自拍视频| 亚洲欧美九九九| 东京热,男人的天堂| 五月婷婷丁香六月丁香| 思思热在线观看| 97超碰总站| 农村女一级毛卡片| 国产成人网址| av草草在线电影| 91被操| 九九毛片这里只有精品| 日本ZZ高免费A级视频| 啊啊啊好多水| 五月丁香网站| 人人妻人人色一区二区三区| 久久青青草原免费视频| 天天操天天射青青草| 国产精品伦理| 不卡免费av在线播放| 久久久久久久久久黄色网| 亚洲无992tv| 精品色色| 四虎影视国产精品| 国产高清在线观看欧美| 免费久久9999| 色综合国产在线观看| 3571色综合一区二区二区| 欧美自拍网| AV无码久久久精品| 后入福利视频| 日本色色色色色视频| 97国产色综合| 大香蕉欧美| 殴美,日韩国产伦精品| 东京热大香蕉| 色噜噜狠狠色综无码久久合欧美| 色噜噜狠狠色综无码久久| 激情干在线| 在线一区| aaaa少妇高潮大片| 人妻天天爽夜夜爽2| AAAAAAAAA黄片| 91女优在线观看| AV免费在线播放一区| 超碰久在线天天做| 午夜精品探花| 91欧美www| 婷婷久草| 曰韩人妻中文字幕在线| 亚熟在线| 亚洲精品国产熟女| 日日嗨AV一区二区夜夜| 在线观看精品国产免费| 久久久99999久网站| 久久高清欧美国产| 天美传媒精品久久视频| 久久xx| 啊啊啊想要| 免费人人搞97| 天天操夜夜嗨| 老司机福利社视频在线观看| 啪啪91| 蜜乳中文字幕a在线| 97 国产一区| 色欲蜜臀AV| 最新制服中文第一页| 天天综合~91入口| 超碰在线人人射| 97精品第3页| 亚洲一区二区中文字幕| 久久三区四区| 亚洲一二三精品久久网| 免费伦费视频在线观看| 超碰4A| 天天摸夜夜摸| 一,爱啪啪,在线免费视频| 人人摸人人舔一区二区| 色99在线| Av手机版天堂网| 蜜臀中文无码午夜| 一二三区在线| 北约熟女超碰| 亚洲黄色| 自拍视频大全亚洲专媒视频/一区二区三区 | 欧美日韩97在线| 欧美亚洲国内自拍| 老司机老司机午夜影院| 夜夜高潮夜夜爽夜夜爱爱一区| 蜜桃传媒一区二区亚洲| 久久久久久久国产a∨| 竹菊一区二区三区AV线| 欧美综合色站| 亚洲五月婷| 人人操 欧美| 激情另类激情| 91美女视频在线| 97五月天| 国产亚洲中文不卡二区| 欧美狠狠| 久久精品女同亚洲女同13| 九九玖玖精品| 五月丁香婷婷综合网| 亚洲三区视频| 好色综合| 91插B网站| 妇人噜噜| 久久精彩视频9| 国产激情在线观看| 亚洲中文字幕久久人妻| 思思热一热婷婷热一热| 可乐操亚洲蜜911| 日韩精品操少妇| 成年女人一区| 在线强奷到舒服的无码视频| 不卡中文字幕aⅴ在线| 78操B| 国产中文字幕在线| 操香逼| 久久久久久久一级黄色打同平台| 亚洲欧美日韩精品久久久一区二区| 丁香九月婷婷| 夜夜夜夜久久久久| 一区超碰一区| 加勒比综合a∨| 久久亚州高清| 精品久久99| 天天添天天干电影| 亚洲综合色婷婷| 亚洲蜜桃V妇女| 亚洲国产一级精品毛一级精品看免费视频 | 国产成人无码网站在线视频| 99re公开精品免费视频| 精品综合久久久久久五月天| 欧美色乱| 久久国产精品m码| 大乔未久88一区| 欧美在线55555| 91艹逼精品| 97超碰逼| 校园春色综合色| 内射黑人| 丰满少妇高潮无码| 久热精品色情| 色爱欲亚洲| 精品视频专区| 国产美女激情| 97精品国产97久久久久久| 九九九九久久久| 丁香五月天社区| 黑丝内射一区二区三区| 97人妻碰碰中文无码久热丝袜| 国产伦精品一区二区三区在线观 | 啊啊啊啊嗯嗯在线久久久| 97伊人超碰| 中文字幕一区二区三区人妻不卡| 欧美九九九| 日天天九九天堂666| 精品人妻一区二区三区视频在线| 精品国产乱码久久久影院| 99最新日韩偷拍视频| 97超碰公开| 91丝袜| 夜夜草我| 国产精品永久免费10000| www.91理论| 日韩不卡av一二三| 日韩久久三区| 色妹子A V| 情色五月天久久久| 欧美一品道| 99国内熟女露脸视频| 208天天久久九九九| 久久三区四区| 国产又黄又粗又猛大片| 日韩黄色片子| 国产 亚洲 丝袜 制服| 色情综合| 欧洲射精91| 91黑丝美女| 九九九九一区| 曰韩中文人妻视频| 中文字幕亚洲永久精品| 免费看欧美美女黄色大片| 国产精品一二三免费网站| 中文字幕亚洲欧美在线不卡| 嗯嗯嗯嗯啊啊啊好紧好大| 久久久久久中文版| 啊啊啊男女| 欧美精品精品一区二区| 人人看人人爰人人操| 国产精品国产拍高清AV| 二区熟妇韩日| 久久久96精品| 精品人妻av区天天看片| 国产h片在线观看视频| 色色五月婷婷| 性色国产东北露脸精品视频| 黄站在线免费观看| 国产拍偷精品网站| 曰韩av中文字幕专区| 曰本精品久久久| 久九9精品| 97在线免费视频| 欧美性爱视频免费一区一A | 9精品久久久久| 无码高清操逼网址| 大香蕉啪啪啪| 美女诱惑在线一区| 欧洲一区二区| 激情天天视频| 九九黄色视频在线观看| 91女网站| 东京男人天堂| 国产精品一区二区三区,亚洲综合| 亚洲不卡AV在线| 久湿久久| 欧洲欧美视频一区二区| 欧美亚洲综合色| 色欲久久99精品久久| 亚洲欧洲自拍图片专区满春格 | 中文字幕人妻资源在线| www.99视频| 秋霞午夜视频一区二区| 免费成人自拍视频在线| 丁香五月性| 超碰伊人在线| 日本熟妇浓毛hdsex| 丁香五月婷婷色| 欧美淫乱视频| 手机在线A片| 久久这里都是精品| 亚洲午夜精品久久久中文影院| 日本女优在线视频福利| 三级网站超变态精品| 综合第一页| 国产亚洲色婷婷久久99精品91| ...日韩成人一区二区三区字幕| 成人av毛片在线观看| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 91欧| 无码国产精品午夜不卡(| 国产 大胆 对白| 欧美一区二区三区不卡高清视频| 水澄无码AV| 日韩人妻无码不卡网站| 99日精品欧美国产| 老女人91| 男女激情黄色网址| 偷拍片久久| a天堂视频| 东京热精品97综合网| 激情 欧美 亚洲 小说| 狠狠搞 亚洲91| 欧美十八禁视频| 四虎影库国产精品免费| 天天射夜夜操| 大香蕉在线视频15| A级国产欧美激情在线| 日本高清电影欧美色图| 人妻熟女av国产网站| 亚洲天天影视色综合| 国产亚洲日本精品在线| 日产123区精品免费观看| 精品成人动漫一区二区| 伊人亚洲综合| 最近的最新的中文字幕视频| 91人妻视频| 岛国视频一二三区| 日韩 女同 综合| 久久性爱免费送| 色区97| 人人摸人人干| 91综合色噜噜| 日本一天色道久久久精品视频| 日本三级A片网站com| 亚洲精品欧洲精品| 亚洲91在线播放影院| 亚洲丰满很很操| 玖玖婷婷五月天| 青青草一区二区高清无码视频| 女优免费一区二区永久| 亚洲中文字幕精品一区| 超碰97最新人妻| 人妻偷拍一区二区三区| 国产精品久久久久久久久久久久久久久久| 亚洲第一狼人丝袜美女另类| 色香综合天天影视综合| 丁香五月性爱| 一区二区高清视频| 大香蕉伊在线久草麻豆天堂故事| 伊人影院综合是一个与深夜成人在线| 久久九九精品一区二区| 久久久五月天| 亚洲国产成人精品久久久国产成人一区二区| 日韩中文字幕av在线播放| 亚洲av影院在线观看| k频道色撸撸| 久操热线| 亚洲熟女乱色一区二区三区| 91 国产丝袜在线播放-百度| AV中文在线可看| 黄色片A级一区二区三区| 另类专区加勒比| 成人资源中文字幕在线观看天天| 精品78| 亚洲少妇喷视频看| av激情亚洲五月天| 台湾佬中文娱乐网久久久久久久久久com| 久久精彩免费视频| 国产一区在线观看无码AV| 黑人精品欧美一区二区蜜桃| 亚洲不卡不卡中文字幕不卡 | 亚洲熟女乱综合一区二区三区| 久久久久9| 操操操五月天婷婷丁香影院| 91少妇通奸网站| 久久色激情一区二区三区| 被体育老师抱着c到高潮| 国产 日韩 欧美一区| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲AV无码天美传媒一区| 国产精品久久久久久久AV大片| 97神马久久| 狠狠做深爱婷婷久久二区| 内射日韩大臀美女| 亚洲一区二区精品福利| 日本性感人妻91| 91色亚洲| 国产人妻精品一区二区三区秋霞 | 91美女高潮| 丝袜无码a片| 五月天大香蕉| 亚洲 国产 精品一区| 亚洲av噜噜噜噜噜噜| 我要色综合网站| 99精品高潮| 欧美一区二区传媒| 人人操av| 日韩一性一交一A片俄罗斯| 干少妇视频| 99这里只有精品| 国产丰满少妇久久久精品影院| 老鸭窝亚洲毛片| 人人看人人摸人人色| 色黄色美女大长腿午夜视频| 人人人干干人人干| 91丝袜美女视频| 亚洲熟久久| 蜜桃精久三区| 精品久一区免费| 午夜精品一区二区三区三上悠亚| 人妻99p| 最新日韩黄片| 尤物黄色在线观看网站| 日韩欧美加勒比| 一区二区影视| 91丝袜视频在线观看| 久久久精选| 午夜精品久久久久久久99| 国产乱人妻精品入口| 91在线丝袜视频| 蜜桃久久久久久| 国内黄色精品| 五月激情啪啪| 日本人妻A片成人免费看片| av国产无码| 亚洲操操| 欧美日韩91| 先锋精品av色鲁| 婷婷五月天激情四射| 99热色精品| 91大学精品激情戏| 精品视频久久久久九九九九9999| 天天舔天天 | 久干9操| xxxx网站亚洲精品| 很黄很色的视频在线观看| 亚洲欧洲日韩天堂av| 激情网色| av片在线观看免费播放| 久久国产热视频97电影| 欧美性爱中文字幕无线码| 91在线精品| 操一区| 三级三级三级日本99| 后入 亚洲 美女 射| 韩国女主播青草福利视频| 婷婷五月天久久精品视频一区二区三区| 色盈盈影院| 色香伊人| 国产精品日日摸天天碰| 曰本道人妻久久久在线不卡色视频| 老鸭窝在线视频播放| 天天92av| 天天激情综合站| 日本欧美亚洲高清在线看| 91大学精品激情戏| 草草电影院| 精品久久久久久无码| 人人操肉肉| 国产成人精品亚洲日本| 欧美日韩国产高清在线一二三区| 青青操综合网| 日本色色网| 中文字幕在线观看AV| 精品久久九| 91久| 国产一区二区三区高清视频| 日va操| 99热色精品|