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

ARTICLE DETAIL

資訊詳情

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

MMCV 代碼規(guī)范完整指南:PEP 8、命名、docstring、類型注解與 pre-commit 落地實(shí)踐

MMCV 代碼規(guī)范完整指南:PEP 8、命名、docstring、類型注解與 pre-commit 落地實(shí)踐 人工智能計(jì)算機(jī)視覺深度學(xué)習(xí)【免費(fèi)下載鏈接】mmcvOpenMMLab Computer Vision Foundation項(xiàng)目地址https://gitcode.com/gh_mirrors/mm/mmcv點(diǎn)擊查看免費(fèi)下載本文是 OpenMMLab 計(jì)算機(jī)視覺基礎(chǔ)庫 MMCV 的代碼風(fēng)格官方指南對(duì)應(yīng)倉庫文檔 docs/zh_cn/community/code_style.md的深度展開版。它面向兩類讀者一是準(zhǔn)備向 MMCV 提交 Pull Request 的貢獻(xiàn)者需要讓代碼通過 pre-commit、CI 與 reviewer 的審查二是希望在項(xiàng)目內(nèi)建立統(tǒng)一代碼規(guī)范的團(tuán)隊(duì)。讀完本文你將掌握 MMCV 所遵循的 PEP 8 與 Google 風(fēng)格取舍、命名與 docstring 的具體寫法、類型注解與 mypy 的使用方法以及 pre-commit 工具鏈的完整配置從而寫出與倉庫風(fēng)格一致、可維護(hù)、易審查的 Python 代碼。一、代碼規(guī)范的兩個(gè)標(biāo)準(zhǔn)與 MMCV 的取舍1.1 PEP 8 —— Python 官方代碼規(guī)范PEP 8 是 Python 官方的代碼風(fēng)格指南是 OpenMMLab 算法庫首選的代碼規(guī)范見 docs/zh_cn/community/contributing.md 中代碼風(fēng)格一節(jié)。它主要覆蓋以下幾方面內(nèi)容代碼布局規(guī)定 Python 中空行、斷行以及導(dǎo)入相關(guān)的風(fēng)格。一個(gè)常見疑問是當(dāng)代碼較長無法在一行內(nèi)寫完時(shí)何處可以斷行PEP 8 給出了明確的換行規(guī)則。表達(dá)式規(guī)定表達(dá)式中空格的使用方式。尾隨逗號(hào)當(dāng)列表較長、無法一行寫下而寫成逐行列表時(shí)推薦在末項(xiàng)之后也加上逗號(hào)便于后續(xù)追加選項(xiàng)和版本控制對(duì)比。尾隨逗號(hào)的正反例# Correct: FILES [setup.cfg, tox.ini] # Correct: FILES [ setup.cfg, tox.ini, ] # Wrong: FILES [setup.cfg, tox.ini,] # Wrong: FILES [ setup.cfg, tox.ini ]命名、注釋、類型注解這些內(nèi)容的詳細(xì)規(guī)范是本文后續(xù)章節(jié)的主體。1.2 項(xiàng)目內(nèi)一致性優(yōu)先于 PEP 8A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important.PEP 8 的規(guī)范并不是絕對(duì)的項(xiàng)目內(nèi)的一致性要優(yōu)先于 PEP 8 的規(guī)范。OpenMMLab 各個(gè)項(xiàng)目都在setup.cfg中設(shè)定了代碼規(guī)范設(shè)置貢獻(xiàn)者應(yīng)遵照這些設(shè)置。例如 PEP 8 中有如下例子# Correct: hypot2 x*x y*y # Wrong: hypot2 x * x y * y這一規(guī)范本意是指示運(yùn)算優(yōu)先級(jí)但 OpenMMLab 的設(shè)置中通常沒有啟用 yapf 的ARITHMETIC_PRECEDENCE_INDICATION選項(xiàng)因而格式規(guī)范工具不會(huì)按照該推薦樣式強(qiáng)制格式化一切以項(xiàng)目實(shí)際配置為準(zhǔn)。打開倉庫根目錄的 setup.cfg 可以看到[yapf] based_on_style pep8 blank_line_before_nested_class_or_def true split_before_expression_after_opening_paren true [isort] line_length 79 multi_line_output 0 extra_standard_library pkg_resources,setuptools,logging,os,warnings,abc known_first_party mmcv known_third_party addict,cv2,matplotlib,numpy,onnx,packaging,pytest,pytorch_sphinx_theme,scipy,sphinx,torch,torchvision,yaml,yapf no_lines_before STDLIB,LOCALFOLDER default_section THIRDPARTY這些配置說明yapf 基于 pep8 風(fēng)格isort 的每行長度限制為 79 字符mmcv被標(biāo)記為 first party而 torch、numpy 等被標(biāo)記為 third party導(dǎo)入順序會(huì)自動(dòng)按標(biāo)準(zhǔn)庫 → 第三方 → 本地模塊排列。1.3 Google 開源項(xiàng)目風(fēng)格指南Google 開源項(xiàng)目風(fēng)格指南Google Python Style Guide比 PEP 8 提供了更詳盡的指導(dǎo)包含語言規(guī)范和風(fēng)格規(guī)范兩個(gè)部分語言規(guī)范對(duì) Python 中許多語言特性異常、Lambda 表達(dá)式、列表推導(dǎo)式、metaclass 等進(jìn)行優(yōu)缺點(diǎn)分析并給出使用意見。風(fēng)格規(guī)范大部分約定建立在 PEP 8 基礎(chǔ)上同時(shí)有更細(xì)的約定如函數(shù)長度、TODO 注釋、文件與 socket 對(duì)象的訪問等。MMCV 推薦將 Google 指南作為開發(fā)參考但不必嚴(yán)格遵照原因有二該指南存在 Python 2 兼容需求例如要求所有無基類的類顯式繼承object而在僅使用 Python 3 的環(huán)境中這一要求不必要按本項(xiàng)目慣例即可OpenMMLab 項(xiàng)目作為框架級(jí)開源軟件不必對(duì)高級(jí)技巧過于避諱尤其是 MMCV但使用這些技巧前應(yīng)認(rèn)真考慮是否真的有必要并尋求其他開發(fā)者的廣泛評(píng)估。需要特別留意的一處差異是包的導(dǎo)入Google 指南要求導(dǎo)入本地包時(shí)使用路徑全稱且每個(gè)模塊單獨(dú)成行。這在 MMCV 中通常不必要也不符合項(xiàng)目開發(fā)慣例本項(xiàng)目約定如下# Correct from mmcv.cnn.bricks import (Conv2d, build_norm_layer, DropPath, MaxPool2d, Linear) from ..utils import ext_loader # Wrong from mmcv.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \ Linear # 使用括號(hào)進(jìn)行連接而不是反斜杠 from ...utils import is_str # 最多向上回溯一層過多的回溯容易導(dǎo)致結(jié)構(gòu)混亂要點(diǎn)跨行導(dǎo)入用括號(hào)連接而非反斜杠相對(duì)導(dǎo)入最多向上回溯一層避免結(jié)構(gòu)混亂。1.4 OpenMMLab 的落地pre-commit 自動(dòng)格式化OpenMMLab 項(xiàng)目使用 pre-commit 工具自動(dòng)格式化代碼具體安裝與使用見 docs/zh_cn/community/contributing.md 的配置 pre-commit與代碼風(fēng)格章節(jié)。核心命令如下須在 MMCV 目錄下執(zhí)行pip install -U pre-commit pre-commit install pre-commit run --all-files中國用戶若因網(wǎng)絡(luò)問題安裝失敗可使用國內(nèi)鏡像配置pre-commit install -c .pre-commit-config-zh-cn.yaml pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml倉庫根目錄的 .pre-commit-config.yaml 是本項(xiàng)目實(shí)際的鉤子配置包含以下工具鏈鉤子作用flake8Python 官方推薦的代碼規(guī)范檢查工具是多個(gè)檢查工具的封裝isort自動(dòng)調(diào)整模塊導(dǎo)入順序yapfGoogle 發(fā)布的代碼格式化工具trailing-whitespace / mixed-line-ending / end-of-file-fixer去除行尾空白、統(tǒng)一行尾符LF、修復(fù)文件末尾換行check-yaml / check-merge-conflict校驗(yàn) YAML 語法、檢查未解決的合并沖突requirements-txt-fixer調(diào)整requirements.txt中包的順序double-quote-string-fixer / fix-encoding-pragma / pyupgrade統(tǒng)一引號(hào)、移除編碼聲明、升級(jí)為 Python 3 語法codespell檢查單詞拼寫mdformat檢查并格式化 Markdown 文件配合 mdformat-openmmlabdocformatter格式化 docstring--in-place --wrap-descriptions 79check-copyright檢查文件版權(quán)頭針對(duì) mmcv、tests排除 mmcv/opsmypy靜態(tài)類型檢查排除 tests 與 docs 目錄其中 C 和 CUDA 代碼遵循 Google C Style Guideclang-format 鉤子在配置中以注釋形式預(yù)留。如果提交的代碼不符合代碼風(fēng)格規(guī)范pre-commit 會(huì)發(fā)出警告并自動(dòng)修復(fù)部分錯(cuò)誤若想臨時(shí)繞開檢查可在git commit時(shí)加上--no-verify僅用于臨時(shí)提交最終推送的代碼必須通過 pre-commit 檢查。二、命名規(guī)范2.1 命名規(guī)范的重要性優(yōu)秀的命名是良好代碼可讀性的基礎(chǔ)?;A(chǔ)命名規(guī)范對(duì)各類變量做約束使讀者能根據(jù)名字判斷它是一個(gè)類、局部變量還是全局變量而優(yōu)秀的命名則要求作者對(duì)變量功能有清晰認(rèn)識(shí)與良好表達(dá)能力讓讀者僅憑名稱即可理解其含義。2.2 基礎(chǔ)命名規(guī)范類型公有私有模塊lower_with_under_lower_with_under包lower_with_under類CapWords_CapWords異常CapWordsError函數(shù)方法lower_with_under_lower_with_under函數(shù) / 方法參數(shù)lower_with_under全局 / 類內(nèi)常量CAPS_WITH_UNDER_CAPS_WITH_UNDER全局 / 類內(nèi)變量lower_with_under_lower_with_under變量lower_with_under_lower_with_under局部變量lower_with_under注意盡量避免變量名與保留字沖突若不可避免可使用一個(gè)后置下劃線如class_盡量不要使用過于簡單的命名約定俗成的循環(huán)變量i、文件變量f、錯(cuò)誤變量e除外不會(huì)被用到的變量可命名為_邏輯檢查器會(huì)將其忽略。2.3 命名技巧良好的變量命名需保證三點(diǎn)含義準(zhǔn)確、沒有歧義長短適中前后統(tǒng)一。# Wrong class Masks(metaclassABCMeta): # 命名無法表現(xiàn)基類Instance or Semantic pass # Correct class BaseInstanceMasks(metaclassABCMeta): pass # Wrong不同地方含義相同的變量盡量用統(tǒng)一的命名 def __init__(self, inplanes, planes): pass def __init__(self, in_channels, out_channels): pass常見的函數(shù)命名方法動(dòng)賓命名法crop_img,init_weights動(dòng)賓倒置命名法imread,bbox_flip注意函數(shù)命名與參數(shù)的順序保證主語在前、符合語言習(xí)慣check_keys_exist(key, container)check_keys_contain(container, key)還要避免非常規(guī)或未統(tǒng)一約定的縮寫如nb→num_blocksin_nc→in_channels。三、docstring 規(guī)范3.1 為什么要寫 docstringdocstring 是對(duì)一個(gè)類、一個(gè)函數(shù)功能與 API 接口的詳細(xì)描述有兩個(gè)功能幫助其他開發(fā)者了解代碼功能方便 debug 和復(fù)用代碼在 Readthedocs 文檔中自動(dòng)生成相關(guān) API reference 文檔幫助不了解源代碼的社區(qū)用戶使用功能。3.2 如何寫 docstring與普通注釋不同規(guī)范的 docstring 有嚴(yán)格的格式要求以便 Python 解釋器與 sphinx 進(jìn)行文檔解析docstring 的基本約定見 PEP 257。MMCV 參考格式為 Google 風(fēng)格同時(shí)結(jié)合了 OpenMMLab 自身慣例。以下按模塊、類、方法三種場景給出標(biāo)準(zhǔn)格式。1. 模塊文檔代碼風(fēng)格規(guī)范推薦為每個(gè)模塊Python 文件編寫 docstring但目前 OpenMMLab 項(xiàng)目大部分沒有此類 docstring因此不做硬性要求。參考格式A one line summary of the module or program, terminated by a period. Leave one blank line. The rest of this docstring should contain an overall description of the module or program. Optionally, it may also contain a brief description of exported classes and functions and/or usage examples. Typical usage example: foo ClassFoo() bar foo.FunctionBar() 2. 類文檔類文檔是貢獻(xiàn)者最常編寫的類型。按照 OpenMMLab 慣例這里使用了與 Google 風(fēng)格不同的寫法不使用 Attributes 描述類屬性而是使用 Args 描述__init__函數(shù)的參數(shù)。Args 中遵照parameter (type): Description.格式描述每個(gè)參數(shù)的類型與功能多種類型可用(float or str)寫法可以為 None 的參數(shù)寫為(int, optional)。class BaseRunner(metaclassABCMeta): The base class of Runner, a training helper for PyTorch. All subclasses should implement the following APIs: - run() - train() - val() - save_checkpoint() Args: model (:obj:torch.nn.Module): The model to be run. batch_processor (callable, optional): A callable method that process a data batch. The interface of this method should be batch_processor(model, data, train_mode) - dict. Defaults to None. optimizer (dict or :obj:torch.optim.Optimizer, optional): It can be either an optimizer (in most cases) or a dict of optimizers (in models that requires more than one optimizer, e.g., GAN). Defaults to None. work_dir (str, optional): The working directory to save checkpoints and logs. Defaults to None. logger (:obj:logging.Logger): Logger used during training. Defaults to None. (The default value is just for backward compatibility) meta (dict, optional): A dict records some import information such as environment info and seed, which will be logged in logger hook. Defaults to None. max_epochs (int, optional): Total training epochs. Defaults to None. max_iters (int, optional): Total training iterations. Defaults to None. def __init__(self, model, batch_processorNone, optimizerNone, work_dirNone, loggerNone, metaNone, max_itersNone, max_epochsNone): ...補(bǔ)充要求在算法實(shí)現(xiàn)的主體類中建議加入原論文鏈接如果參考了其他開源代碼實(shí)現(xiàn)應(yīng)加入modified from直接復(fù)制了其他代碼庫實(shí)現(xiàn)則應(yīng)加入copied from并注意源碼的 License如有必要可通過.. math::加入數(shù)學(xué)公式。# 參考實(shí)現(xiàn) # This func is modified from detectron2 # ..._. # 復(fù)制代碼 # This code was copied from the ubelt # library..._. # 引用論文 添加公式 class LabelSmoothLoss(nn.Module): rInitializer for the label smoothed cross entropy loss. Refers to Rethinking the Inception Architecture for Computer Vision ..._. This decreases gap between output scores and encourages generalization. Labels provided to forward can be one-hot like vectors (NxC) or class indices (Nx1). And this accepts linear combination of one-hot like labels from mixup or cutmix except multi-label task. Args: label_smooth_val (float): The degree of label smoothing. num_classes (int, optional): Number of classes. Defaults to None. mode (str): Refers to notes, Options are original, classy_vision, multi_label. Defaults to classy_vision. reduction (str): The method used to reduce the loss. Options are none, mean and sum. Defaults to mean. loss_weight (float): Weight of the loss. Defaults to 1.0. Note: if the mode is original, this will use the same label smooth method as the original paper as: .. math:: (1-\epsilon)\delta_{k, y} \frac{\epsilon}{K} where :math:\epsilon is the label_smooth_val, :math:K is the num_classes and :math:\delta_{k,y} is Dirac delta, which equals 1 for ky and 0 otherwise. if the mode is classy_vision, this will use the same label smooth method as the facebookresearch/ClassyVision ..._ repo as: .. math:: \frac{\delta_{k, y} \epsilon/K}{1\epsilon} if the mode is multi_label, this will accept labels from multi-label task and smoothing them as: .. math:: (1-2\epsilon)\delta_{k, y} \epsilon 注意 reStructuredText 中三種引號(hào)功能不同here雙反引號(hào)表示一段代碼here單反引號(hào)表示斜體here雙引號(hào)無特殊含義一般表示字符串。其中單反引號(hào)的用法與 Markdown 不同需要多加留意。另外還有:obj:type 這種更規(guī)范的表示類的寫法鑒于長度不做特別要求一般僅用于表示非常用類型。3. 方法函數(shù)文檔函數(shù)文檔與類文檔結(jié)構(gòu)基本一致但需要加入返回值文檔。對(duì)于較復(fù)雜的函數(shù)和類可使用Examples字段加入示例如果需要給參數(shù)加入較長備注可加入Note字段。示例最好能直接在 Python 交互式環(huán)境中運(yùn)行并給出對(duì)應(yīng)結(jié)果多個(gè)示例可用注釋分隔說明。def import_modules_from_strings(imports, allow_failed_importsFalse): Import modules from the given list of strings. Args: imports (list | str | None): The given module names to be imported. allow_failed_imports (bool): If True, the failed imports will return None. Otherwise, an ImportError is raise. Defaults to False. Returns: List[module] | module | None: The imported modules. All these three lines in docstring will be compiled into the same line in readthedocs. Examples: osp, sys import_modules_from_strings( ... [os.path, sys]) import os.path as osp_ import sys as sys_ assert osp osp_ assert sys sys_ ...如果函數(shù)接口在某個(gè)版本發(fā)生了變化需要在 docstring 中加入說明必要時(shí)添加Note或Warningclass CheckpointHook(Hook): Save checkpoints periodically. Args: out_dir (str, optional): The root directory to save checkpoints. If not specified, runner.work_dir will be used by default. If specified, the out_dir will be the concatenation of out_dir and the last level directory of runner.work_dir. Defaults to None. Changed in version 1.3.15. file_client_args (dict, optional): Arguments to instantiate a FileClient. See :class:mmcv.fileio.FileClient for details. Defaults to None. New in version 1.3.15. Warning: Before v1.3.15, the out_dir argument indicates the path where the checkpoint is stored. However, in v1.3.15 and later, out_dir indicates the root directory and the final path to save checkpoint is the concatenation of out_dir and the last level directory of runner.work_dir. Suppose the value of out_dir is /path/of/A and the value of runner.work_dir is /path/of/B, then the final path will be /path/of/A/B. 如果參數(shù)或返回值里帶有需要展開描述字段的 dict應(yīng)采用如下格式def func(x): r Args: x (None): A dict with 2 keys, padded_targets, and targets. - targets (list[Tensor]): A list of tensors. Each tensor has the shape of :math:(T_i). Each element is the index of a character. - padded_targets (Tensor): A tensor of shape :math:(N). Each item is the length of a word. Returns: dict: A dict with 2 keys, padded_targets, and targets. - targets (list[Tensor]): A list of tensors. Each tensor has the shape of :math:(T_i). Each element is the index of a character. - padded_targets (Tensor): A tensor of shape :math:(N). Each item is the length of a word. return x3.3 docstring 與 readthedocs 渲染為了生成 readthedocs 文檔docstring 需要按照 reStructuredText 文檔格式編寫否則會(huì)產(chǎn)生文檔渲染錯(cuò)誤。在提交 PR 前最好生成并預(yù)覽文檔效果方法見 docs/zh_cn/community/contributing.md 的文檔渲染指引pip install -r requirements/docs.txt cd docs/zh_cn/ # or docs/en make html # check file in ./docs/zh_cn/_build/html/index.html語法規(guī)范參考 reStructuredText PrimerSphinx 官方文檔與 Example Google Style Python Docstringssphinxcontrib-napoleon 文檔。OpenMMLab 使用 pytorch_sphinx_theme 與 napoleon 擴(kuò)展見 requirements/docs.txt 與 docs/zh_cn/conf.py將上述 Google 風(fēng)格的 docstring 自動(dòng)渲染為 API reference 頁面如 docs/zh_cn/api/ 下各模塊的 .rst 文件。四、注釋規(guī)范4.1 為什么要寫注釋對(duì)于一個(gè)開源項(xiàng)目團(tuán)隊(duì)合作以及社區(qū)之間的合作必不可少因此尤其要重視合理注釋。不寫注釋的代碼可能過幾個(gè)月連作者自己也難以理解造成額外的閱讀和修改成本。4.2 如何寫注釋最需要寫注釋的是代碼中技巧性的部分。如果你在下次代碼審查的時(shí)候必須解釋一下那么你應(yīng)該現(xiàn)在就給它寫注釋。對(duì)于復(fù)雜的操作應(yīng)該在其操作開始前寫上若干行注釋對(duì)于不是一目了然的代碼應(yīng)在其行尾添加注釋。Google 開源項(xiàng)目風(fēng)格指南# We use a weighted dictionary search to find out where i is in # the array. We extrapolate position based on the largest num # in the array and the array size and then do binary search to # get the exact number. if i (i-1) 0: # True if i is 0 or a power of 2.兩條硬性規(guī)則為了提高可讀性注釋應(yīng)至少離開代碼2 個(gè)空格絕不要描述代碼。假設(shè)閱讀代碼的人比你更懂 Python他只是不知道你的代碼要做什么。Google 開源項(xiàng)目風(fēng)格指南# Wrong: # Now go through the b array and make sure whenever i occurs # the next element is i1 # Wrong: if i (i-1) 0: # True if i bitwise and i-1 is 0.在注釋中可以使用 Markdown 語法開發(fā)人員通常熟悉 Markdown便于交流理解如用單反引號(hào)表示代碼和變量——注意不要與 docstring 中的 reStructuredText 語法混淆# _reversed_padding_repeated_twice is the padding to be passed to # F.pad if needed (e.g., for non-zero padding types that are # implemented as two ops: padding conv). F.pad accepts paddings in # reverse order than the dimension. self._reversed_padding_repeated_twice _reverse_repeat_tuple(self.padding, 2)4.3 注釋示例代碼風(fēng)格文檔給出了兩類典型注釋場景復(fù)雜邏輯結(jié)構(gòu)對(duì)優(yōu)先級(jí)關(guān)系進(jìn)行說明。例如 registry 構(gòu)建函數(shù)的選擇邏輯# self.build_func will be set with the following priority: # 1. build_func # 2. parent.build_func # 3. build_from_cfg if build_func is None: if parent is not None: self.build_func parent.build_func else: self.build_func build_from_cfg else: self.build_func build_funcbug 修復(fù)的特殊處理附帶相關(guān) issue 鏈接幫助其他人了解 bug 背景。例如 checkpoint 保存時(shí)針對(duì) PyTorch 1.6 文件格式變更的兼容處理def _save_ckpt(checkpoint, file): # The 1.6 release of PyTorch switched torch.save to use a new # zipfile-based file format. It will cause RuntimeError when a # checkpoint was saved in high version (PyTorch version1.6.0) but # loaded in low version (PyTorch version1.6.0). More details at # https://github.com/open-mmlab/mmpose/issues/904 if digit_version(TORCH_VERSION) digit_version(1.6.0): torch.save(checkpoint, file, _use_new_zipfile_serializationFalse) else: torch.save(checkpoint, file)五、類型注解5.1 為什么要寫類型注解類型注解是對(duì)函數(shù)中變量的類型做限定或提示為代碼的安全性提供保障、增強(qiáng)可讀性、避免出現(xiàn)類型相關(guān)的錯(cuò)誤。Python 對(duì)類型沒有強(qiáng)制限制類型注解只起提示作用IDE 會(huì)解析注解并在調(diào)用代碼時(shí)給出類型提示類型注解檢查工具如 mypy則會(huì)根據(jù)注解對(duì)代碼中可能出現(xiàn)的問題進(jìn)行檢查減少 bug 的出現(xiàn)。通常不需要注釋模塊中的所有函數(shù)按以下原則權(quán)衡公共的 API 需要注釋在代碼的安全性、清晰性和靈活性之間權(quán)衡是否注釋對(duì)于容易出現(xiàn)類型相關(guān)錯(cuò)誤的代碼進(jìn)行注釋難以理解的代碼請(qǐng)進(jìn)行注釋若代碼中的類型已經(jīng)穩(wěn)定可以進(jìn)行注釋。對(duì)于一份成熟的代碼多數(shù)情況下即使注釋了所有函數(shù)也不會(huì)喪失太多靈活性。5.2 函數(shù) / 方法類型注解通常不對(duì)self和cls注釋。根據(jù)行寬有多種寫法from typing import Optional, List, Tuple # 全部位于一行 def my_method(self, first_var: int) - int: pass # 另起一行 def my_method( self, first_var: int, second_var: float) - Tuple[MyLongType1, MyLongType1, MyLongType1]: pass # 單獨(dú)成行具體的應(yīng)用場合與行寬有關(guān)建議結(jié)合 yapf 自動(dòng)化格式使用 def my_method( self, first_var: int, second_var: float ) - Tuple[MyLongType1, MyLongType1, MyLongType1]: pass # 引用尚未被定義的類型 class MyClass: def __init__(self, stack: List[MyClass]) - None: pass類型注解中的類型可以是 Python 內(nèi)置類型、自定義類也可以使用typing提供的 wrapper 類進(jìn)行裝飾。常用注解# 數(shù)值類型 from numbers import Number # 可選類型指參數(shù)可以為 None from typing import Optional def foo(var: Optional[int] None): pass # 聯(lián)合類型指同時(shí)接受多種類型 from typing import Union def foo(var: Union[float, str]): pass from typing import Sequence # 序列類型 from typing import Iterable # 可迭代類型 from typing import Any # 任意類型 from typing import Callable # 可調(diào)用類型 from typing import List, Dict # 列表和字典的泛型類型 from typing import Tuple # 元組的特殊格式 # 雖然在 Python 3.9 中l(wèi)ist, tuple 和 dict 本身已支持泛型但為了支持之前的版本 # 我們?cè)谶M(jìn)行類型注解時(shí)還是需要使用 List, Tuple, Dict 類型 # 另外在對(duì)參數(shù)類型進(jìn)行注解時(shí)盡量使用 Sequence Iterable Mapping # List, Tuple, Dict 主要用于返回值類型注解5.3 變量類型注解一般用于難以直接推斷類型時(shí)# Recommend: 帶類型注解的賦值 a: Foo SomeUndecoratedFunction() a: List[int]: [1, 2, 3] # List 只支持單一類型泛型可使用 Union b: Tuple[int, int] (1, 2) # 長度固定為 2 c: Tuple[int, ...] (1, 2, 3) # 變長 d: Dict[str, int] {a: 1, b: 2} # Not Recommend行尾類型注釋 # 雖然這種方式被寫在了 Google 開源指南中但這是一種為了支持 Python 2.7 版本 # 而補(bǔ)充的注釋方式鑒于我們只支持 Python 3, 為了風(fēng)格統(tǒng)一不推薦使用這種方式。 a SomeUndecoratedFunction() # type: Foo a [1, 2, 3] # type: List[int] b (1, 2, 3) # type: Tuple[int, ...] c (1, 2, 3.5) # type: Tuple[int, Text, float]5.4 自定義泛型除了使用typing內(nèi)置的List、Dict泛型也可以利用TypeVar和Generic定義自己的泛型from typing import TypeVar, Generic KT TypeVar(KT) VT TypeVar(VT) class Mapping(Generic[KT, VT]): def __init__(self, data: Dict[KT, VT]): self._data data def __getitem__(self, key: KT) - VT: return self._data[key]使用上述方法定義了一個(gè)擁有泛型能力的映射類mapping Mappingstr, float value: float example[a]另外可以利用TypeVar在函數(shù)簽名中指定聯(lián)動(dòng)的多個(gè)類型from typing import TypeVar, List T TypeVar(T) # Can be anything A TypeVar(A, str, bytes) # Must be str or bytes def repeat(x: T, n: int) - List[T]: Return a list containing n references to x. return [x]*n def longest(x: A, y: A) - A: Return the longest of two strings. return x if len(x) len(y) else y5.5 mypy類型注解檢查工具mypy 是一個(gè) Python 靜態(tài)類型檢查工具。它會(huì)根據(jù)類型注解檢查傳參、賦值等操作是否符合注解從而避免可能出現(xiàn)的 bug??紤]如下腳本test.pydef foo(var: int) - float: return float(var) a: str foo(2.0) b: int foo(3.0) # type: ignore運(yùn)行mypy test.py得到test.py:4: error: Incompatible types in assignment (expression has type float, variable has type int) test.py:4: error: Argument 1 to foo has incompatible type str; expected int Found 2 errors in 1 file (checked 1 source file)輸出分別指出了第 4 行在函數(shù)調(diào)用參數(shù)和返回值賦值兩處的類型錯(cuò)誤第 5 行同樣存在兩處類型錯(cuò)誤但因?yàn)槭褂昧藅ype: ignore而被忽略——只有部分特殊情況才需要此類忽略。MMCV 在提交代碼時(shí)要求補(bǔ)充類型注解并通過 mypy 檢查mypy 鉤子已配置在 .pre-commit-config.yaml 中排除了 tests 與 docs 目錄。六、提交 PR 前的代碼規(guī)范自查清單結(jié)合 docs/zh_cn/community/contributing.md 與 docs/zh_cn/community/pr.md向 MMCV 提交代碼前應(yīng)完成以下檢查pre-commit 檢查在 MMCV 目錄下執(zhí)行pre-commit run --all-files確保 flake8、yapf、isort、mdformat、docformatter、codespell、mypy 等鉤子全部通過若鉤子安裝被網(wǎng)絡(luò)中斷可重復(fù)執(zhí)行pre-commit run ...繼續(xù)安裝單元測試pytest tests通過全量測試至少保證修改模塊的測試通過例如pytest tests/test_utils/test_env.py可用python -m coverage run -m pytest /path/to/test_file python -m coverage html檢查覆蓋率查看htmlcov/index.html文檔渲染若修改/新增了 docstring 或文檔安裝pip install -r requirements/docs.txt后在docs/zh_cn/或docs/en/下執(zhí)行make html確認(rèn) reStructuredText 語法渲染無誤檢查docs/zh_cn/_build/html/index.html代碼風(fēng)格Python 遵循 PEP 8 并遵循本文全部規(guī)范C 與 CUDA 遵循 Google C Style GuidePR 粒度與描述一個(gè) PR 只做一件事粒度要細(xì)標(biāo)題格式為[Prefix] Short description (Suffix)前綴包括[Feature]新功能、[Fix]修 bug、[Docs]文檔、[WIP]開發(fā)中描述中說明修改理由、修改內(nèi)容與影響并關(guān)聯(lián)相關(guān) Issue。遵守這套規(guī)范既能保證你的代碼與 MMCV 現(xiàn)有代碼庫高度一致也能讓代碼在 Readthedocs 上正確渲染為 API 文檔惠及所有社區(qū)用戶。贊分享人工智能計(jì)算機(jī)視覺深度學(xué)習(xí)【免費(fèi)下載鏈接】mmcvOpenMMLab Computer Vision Foundation項(xiàng)目地址https://gitcode.com/gh_mirrors/mm/mmcv點(diǎn)擊查看免費(fèi)下載相關(guān)推薦QUANTAXIS Python 代碼規(guī)范完全指南PEP 8、類型注解、命名規(guī)范與質(zhì)量工具實(shí)戰(zhàn)QUANTAXIS Python 代碼規(guī)范完全指南PEP 8、類型注解、命名規(guī)范與質(zhì)量工具實(shí)戰(zhàn) 本文依據(jù)倉庫文檔 doc/development/code s金融科技后端數(shù)據(jù)分析DeepChem 開發(fā)規(guī)范指南從 pre-commit 到類型注解的完整代碼質(zhì)量保障體系DeepChem 開發(fā)規(guī)范指南從 pre commit 到類型注解的完整代碼質(zhì)量保障體系 本篇技術(shù)指南以 DeepChem 官方開發(fā)文檔中的 Coding C人工智能深度學(xué)習(xí)機(jī)器學(xué)習(xí)生物信息學(xué)科學(xué)計(jì)算Python 3編碼規(guī)范與最佳實(shí)踐PEP 8完全解讀指南Python 3編碼規(guī)范與最佳實(shí)踐PEP 8完全解讀指南 想要寫出專業(yè)、易讀且符合行業(yè)標(biāo)準(zhǔn)的Python代碼嗎掌握PEP 8編碼規(guī)范是每個(gè)Python開發(fā)者文檔教程上一篇告別氣候數(shù)據(jù)處理困境用sqlx構(gòu)建高效驗(yàn)證案例數(shù)據(jù)庫下一篇gh_mirrors/ove/overleaf代碼審查流程PR規(guī)范與自動(dòng)化檢查創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美性爱第一页久久| 99.色网| 老熟乱一区二区三区四区| 人妻少妇久久久| 国产精品直播在线观看直播| 久久天堂网| 激情一区二区三区在线观看| 蜜臀操逼黄色视频操的好爽| 久久欲| 日韩青久久| 日本少妇va7777| 天天躁日日躁AAA片李宗瑞| 91亚州| 天天肏夜夜肏| 国产美女91| 做爱福利视频一区二区| 欧美色图亚洲色| 日韩9999| 亚洲视频,小说| 狠狠综合网| 色999五月色| 一级久久久久久久久久久| 1769成人国产精品视频| 国产精品麻豆免费视频| 日韩无码视频黄色| 久久久久亚洲AV无码专区少妇| 91性片| 91欧| 久久久久久性爱免费视频| 久久久久久久久国产| 青青草男人天堂| 欧美欲色| 天天摸夜夜摸| 美女诱惑在线一区| 91老熟女老女人国产老太| 二对二中文字幕。| 日日夜夜青青草母狗| 99爱久久视频频| 亚洲成人一二三区| 台湾肥佬网一区二区三区| 欧美制服另类丝袜| 国产有码一区| 搡老女人老91妇女熟女| 超碰97导航| 91国产丝袜白虎| 欧美天天综合网版| 亚洲色图欧美色图另类图片| 日本影视久久免费| 97精品久久久久久久| 四虎AV无码| 樱花草社区www中国| 青青草原综合久久大伊人精品| 综合日本女人伊人| 欧美色日本| 好看的久久不射无码影视影院| 伊人久久亚洲中文字幕不卡| 老鸭窝在线视频播放| 五月天AV资源| 久久久性| 一区二区三区免费岛国片| 日韩欧美tv一区二区在线观看| 中文操嬖片。| 成人热久久精品| 很很很很操| 干妹子| 国产成人精品网站| 国产亚州高清国产拍精| 天天日天天操心| 国产乱码久久| 亚州男人的天堂| 抽插亚洲无码| 欧美一区二区日韩三区| 久久人妻精品| 97视频新免费| 欧美日韩精品久久久久久久久东北老熟妇| 日本欧美中文字幕| 黑人嘿嘿嘿超爽免费视频| 久久人妻精品| 加勒比综合a∨| 熟女精品日韩一区二区三区 | 日韩AC| 丁香五月激情综合| 91欧美少妇| 91人妻人人澡人人爽人人精品| 熟妇xxxxx性春色| 欧洲大香蕉| 精品午夜福利| 996热| 国产亚洲色婷婷99精品91| 日韩欧美久久婷婷网站| 国产女人和拘做爰视频| 九色97| 老鸭窝日丰县女人| 国产精品区在线12p| 69精品人人人人| 嫩草影院永久在线制服丝袜| 高清国产精品福利网站| 久久久婷婷婷| 91观看 国产白丝| 亚洲国产尤物yw在线观看| 红杏大香蕉| 精品一区二区三区18| 97人人夜夜精品视频| 亚洲天堂东京热| 极品出轨视频网站| 欧美顶级黄色大片免费| 91天天爱| 欧美gv在线观看| 色色丁香| 国产日本顶级一区二区三区| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 国产精品电| 国产日韩欧美中文在线播放| 午夜欧美J进J出白浆流出久久久| 九九九免费视频| 99热这里是精品| 九九热精品视频六| 大奶啊啊好爽| 久草午夜| 91黑丝少妇| 男人天堂网址| 五月婷婷hd| 日韩成人无码| 自拍视频大全亚洲专媒视频/一区二区三区 | 中文字幕日本久久| 国产丝袜啪啪| 99在线免费视频| 国产国产亚洲一二三久久| 国产吞精a级片激情电影| 极品久久久久久久久久久久久久| 国产精品69人妻无码久久久| 欧美成人国产精品| 99热超碰| 人人搞人人插人人操| 久热伊人99re| 日韩视频精品在线观看| 久久精品老司| 一区二区三区免费岛国片| 欧美伦乱| 欧日韩不卡视.频| 少妇一级婬片免费放一级a性色.| AV色五月天| 亚洲色图日韩精品| 试看日韩黄片| 锕锕好爽 死我在线观看| 淫荡熟女乱伦网| 五月天人妻综合| 天天干天天拍| 国产精品麻豆视频网站| 欧美天天搞| 青娱乐亚洲热| 日韩AC| 久久久96| 超碰欧美在线欧美| 99久久综合网| www久久国产精品| 9999久久久久| 亚洲色鬼| 亚洲中文国际强奸字幕| 午夜毛片亚洲精品片国产久久久| 校园春色宗合网| 亚洲综合五月天| 国产91会所女技师在线观看| 麻豆熟妇乱妇熟色A片在线看| 亚码激情| 国产激情在线| 性色AV网站| 啊啊啊啊啊好舒服视频| 亚91网| 国产尤物AV尤物在线观看不卡| 欧美日韩大香蕉| 日韩精品在线观看网站| 九七色图| 欧美色图成人网一区二区| 亚洲无992tv| 97超碰逼| caorenqi shipin| 日本人妻中文字幕精品| 欧美在线电影| 天天操熟妇| 欧美最婬乱婬爆婬性视频| 国产精品久久久无码AV网站| 免费自拍三级综合| 九九精品99| 日韩中文字幕视频| 日韩AV无码网站| 国内一级精品| 亚洲精品97| 网友自拍第1页| 国产综合久久久麻桃个| 人妻欧美| 嫩草在线视频| 操屄不卡视频| 不卡码视频| 日韩钢筋无码高清啾啾啾| 老熟女熟妇| 精品一二三区女同| 超碰美国| 免费一级a毛片久久久久久鸭绿欲| 欧美一区二区日韩三区| 国产三区免费在线观看| 人妻天堂综合网| 99亚洲天堂| 亚洲丝袜二区| 强奸熟女一区二区三区| juliaann欧美丝袜办公室| 特色a在线上| 色就色综合| 性爱1区| 色噜噜国产在线| 久久99精品国产| 久久久久久久| 日韩av影片在线观看| 97青青操视频| 久久精品高清无码一区| 美女黄页网站| 插欧洲美女欧美精品| 嗯阿好爽好紧| 久久AV无码AV| 人夜夜精品网站香蕉嫩草| 97av在线观看| 狠日操| 另类av天堂| 九九热AV| 五月综合色| 91精品91久久久久77777| 免费看美国人人爽,人人操| 一区二区播放| 亚洲熟女乱色| 国产精品福利资源在线尤物| 欧美乱色| 色官网色综合| 夜夜无码| 超碰人人妻| 国产精品白领在线观看| 久久极品一区二区| 在线国产福利网址导航| 999久久久九| 日韩成人人妻网站| 91强奸乱轮| 999 久久久| 成人一道本免费视频| 国产久久一区二区三区野外在线| 黄片免费日韩| 亚洲色综合| 亚欧操逼片在线观看| 色婷婷影视| 人人么人人操| 久久久国产护士丝袜美腿一| 丁香六月婷婷| 中国一级操逼视频| 97香蕉网| 人妻熟妇一区二区三区| 久久国产对白激情浪潮| 七久久久| 国产白丝在线| 性爱动态120秒| 色婷婷视频| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 91久久伊人婷婷青青草| 丁香五月AV| 亚州免费啪啪视频| 日韩操p| 日韩在线国产字幕| 亚州欧美另类| 97超碰欧美手机| 蜜臀99久久精品久久久久久| 日本熟妇自慰性高潮一区二区三区| 樱花草社区www中国| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 台湾佬中文娱乐网久久久久久久久久com | 日本媚薬中文字幕在线| 大香蕉之青青草原| 九九九九免费视频| 人妻激情视频| 亚洲欧美另类图片| 久久精品人妻一区| 亚洲欧美首页| 91精品91久久久中77777| 快点操死我| 人妻嗯啊啊在线播放| 亚洲精品天堂久久A∨51成人漫| 色吧91| 97超碰影音| 九九九九九九免费视频| 日韩大香蕉精品在线视频| 草b在线| 亚洲色图激情小说| 人妻啊啊人妻啊| 婷婷五月天成人| 亚洲激情AV| 黄色av一区二区在线| 九九黄色视频在线观看| 狠狠干综合| 无遮挡h肉动漫在线观看| 国产无码一二三区| 免费观看啪视频| 婷婷亚洲中文字幕在线| 污污污8888| 走光一区92下载| 2026国产精品视频| 麻豆天美在线喷水AV| 狠狠做深爱婷婷久久二区| 自拍二页| 91情色在线| 四虎免费在线播放| 一级AV性爱| 嫖老熟女A片一二三区| 中文字幕熟女人妻丝袜丝| 另类TS人妖一区二区三区| 欧美日韩1234| 约操熟妇| 东北女人| 日本一区视频在线观看| 亚洲国产精品乱码在线观看| 偷拍亚洲视频一区二区三区四区| 久久av无码| 日本熟妇一区二区三区| 99热婷婷一区二区三| 26uuu性| 天美麻豆精品视频99| 91天天美女| 日本激情免费大片| 亚洲午夜蜜臀| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 伦理弟一页| 性感美女91影视| 亚洲国产精品乱码在线观看| 亚洲AV无码AV吞精久久久久| 亚洲精品久| 亚洲午夜福利视频| 色色色欧美| 国产蜜臀在线| 久久精品国产96精品亚洲拳交| 色噜噜人妻av 中文字幕| 密臀在线视频| 3571色综合一区二区二区| 青青草公开在线免费不卡视频| 无码精品久久久天天影视| 97大色网| 立川理惠加勒比无码| 久久精品无码熟妇一区二区三区视频导航 | 精品黄色电影| 亚洲综合网电影91| 国产欧美日本亚洲精品| 亚州色阁| 中文字幕日韩综合| 国产精品美女久久久久AⅤ国产馆| 女色视频社区| 国产中文字幕曰本毛片| 在线a亚洲视频播放在线| 99国产在线绯色一区| 久久精品中文字幕无码l| 日韩内| 九九九精品一区二区无码| 五月天啪啪| 国产高清MV操逼视频| 中国人高清www色视频免费| 97爱啪| 中出789在线视频| 成人日韩欧美| 久久香蕉影院| 婷婷五月色| 欧美亚洲尤物久久| 久久精品国产亚洲AV高级北京| 成人av在线播放| 亚洲日韩天堂| 韩国免费播放一级毛片| 黄片www视频免费| 91丝袜| 欧美综合中文| 狠狠躁伊人中文字幕| 国产乱码精品久久久久久| 九九精品美女高溯喷水| 国产乱码久久| 刺激性视频黄页| 欧美|91色综合| 久久综合久久综合人久久夜精品| 成人免费不卡在线视频| 国产中文精品一区二区在线观看 | 蜜乳AV.COM| 日本孕妇一区二区视频操逼免费看 | 日韩精品99999| av片在线观看免费播放| av国产无码| 欧洲熟妇xxXx欧美老妇裸体| 亚洲成人久久美女| 人人色97| 有码人妻系列| 中国黑人三级片网站上区| 91色五月俺来也| 91夜夜蜜桃臀1区2区3区| 观看视频图片一区二区三区| 精品亚州18| 五月天伊人| 一级黄碟在线观看| 久操视频免费观看| 婷婷探花久久精品一区| 中文有码9| 91亚洲网站| 神马久久久久久久| 操婢日韩| 亚洲偷拍自拍在线视频| 精品亚洲国产成人AV制服丝袜| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 毛片17S| 亚洲第一页欧美| 久久久久久久久久黄色网| 98福利在线视频| 一级免费精品| 日日夜夜精品视频| 国产精品极品美女视频| 91精品国产麻豆国产自产在| 亚洲另类综合欧美| 超碰97在线中文| 天天操妹子| 久久的免费性爱视频| 免费观看网黄| 日本污ww视频网站| 2025亚洲男人天堂| 99热国产精品| 亲子敌伦对白在线播放| 亚欧无码在线| 18精品一区| 欧美传媒一区| 精品国产av一区二区三区四区入口| 五月婷婷六月丁香网址| 东京热激情视频一二三区| 传媒免费一区二区三区| 97干97色| 久久精品三级影视| caopeng97人妻| 啊啊在线| 一区二区三区探花在线观看| www.97在线| 屁股久久久久久久久| 亚洲女人91| 思思热久久成人| 久久久久久欧美精品se一二三四| 嗯嗯啊好大| 亚洲图片视频小说| 在线A日本| 国产少妇肉丝在线观看| 久久久久久九九九九九九| 亚洲 无码 偷拍| 色一情一乱一乱一区91Av| 撸撸成人在线视频| 国产白丝精品在线观看| 99色在线| 蜜臀99久久精品| 操逼啊啊啊91| 精品人妻视频一区二区三区蜜桃视频| 精品九九九九九九| 婷婷色婷婷| 久久久草草精品| 极品欧美一区二区三区| 亚洲另类久操网| 亚洲综合网91| 国产无马av| 无码九九九九| 91成人在线免费视频| 91麻豆天美传媒在线| 日韩美女操b| 日韩啪啪啪视频| 国产9区| 五月丁香狠狠爱| 亚洲欧美伦综合| 丁香色五月 97干| 久久9精品视频| 色逼综合| 亚洲精品久久久久久久久豆丁网| 大香蕉99re| 桃花色涩综合影院| 日本免费二区三区| 九九亚洲| 91亚洲欧洲| 色色色色色色色色色色色色色色综合| 亚洲视频精选| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 精产国品一区二三产品| 国产兽交视频在线播放| 久插综合| 欧美性巨大╳╳╳╳╳高跟鞋| 九九九九欧美| 在免费jIzzjIzz在线视频| 亚洲综人| 夂久色| 啊啊啊好多水| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 天天射夜夜操| 国产91精品在线免费| 91天天日| 很黄很色的视频在线观看| 学生妹天天看| AV九九| 麻豆久久精品亚洲精品88 | 亚洲AV成人无码一二三久久| 久久这里| 丁香六月婷| 99热在线观看| 中出789在线视频| 亚洲乱码国产乱码精网站| 激情另类激情| juliaann精品熟女一区| 色婷婷视频| 亚洲少妇视频| 性性欧美| 五月婷丁香| 无码高清少妇久久| 欧美后入式| 色妹子A V| 国产一进一出视频网站| 精品国产乱码久久久A| 人妻在线臀日韩| 性爱精品一区| se吧提供国产乱老熟视频胖女人 | 国产91乱伦| 亚洲人妻色图| 乱欲性色| 韩国女主播青草福利视频| 日韩乱伦影音先锋| 97操| 97国产|免费| 欧亚久久偷拍视频| 天天做天天爱天天高潮| 交换娇妻呻吟声不停中文字幕| 老熟乱一区二区三区四区| 乱老熟女一区二区三区| 日韩欧美视频青青| 色yeye成人免费视频| 亚洲综合另类| 色综合大香蕉| 亚洲情色综合网| 91精品丝袜久久久久久无码人妻| 久久久久国产无av| 你想操日本小逼吗| 久久草草亚洲蜜桃臀| 精品一区二区三区18| 国产精品久久久久久久久久久久久久久久 | 免费观看国产小粉嫩喷水精品午| 狠狠干91| 99热销国产这里有精品| 精品白丝一区| 亚洲国产91精品一区二区久久| 丝袜足交视频| 欧洲人妻视频| 青青青青青手机视频| 国产吹潮女在线观看| 一区,二区,三区视频| 日本精品人妻少妇一区二区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 国产午夜福利专区综合| 91精品91久久久久77777俄罗斯老妇姓x| 国产AV人人夜夜澡人人爽麻豆| 青青草视频导航官网| 亚洲国产一区二区三区在线| 青青草原狼av| 日本青青草在线| 嗯嗯嗯嗯啊啊啊好紧好大| 国产成人网| 五月天婷婷色色| 婷婷香蕉| 天美av在线观看| 国产在线76页| 97二区四区| 中美日韩毛片| 天综合网欧美| 精品制服美女中文一区二区三区| 国模91| 色香综合天天影视综合| 中精品一区二区三区| 91九色丰满高潮| 国内毛片四区| 91欧美亚洲| 99无码狠狠久久| 26uuu成人影片| 黑人美精品 A片| 手机在线视频国内精品| 在线性黄高清免费视频| 丁香五月影院| 日韩AV中文字幕电影| 欧美中字二区| 日韩BBN| 欧美亚洲情色| 亚洲h片在线免费观看| 国语精品内射在线观看| 丁香五月电影| 日韩免费a级毛片无码a∨| 人人搞人人插人人操| 久久精品日韩| 久久五月婷| 成年男人的天堂| 欧美激情色婷婷花野真衣一区二区| 亚洲极品| 欧美gv在线观看| www.大香| 亚洲,欧美,春色,另类| 操人妻逼91| 丝袜视频网国产90| 亚洲网站一区二区在线| 日本免费专区| 91麻豆天美国产欧美日| 亚洲的天堂网| 精品福利| 国产又色又爽又舒服的三级视频| 江都AV在线| 欧美大色交| 超碰色综合| 欧美视频一区二区在线| 久久超碰爱| 舔人妻中文免费视频| 呦呦一区| 亚洲成人网站在线观看| 黑人与人妻| 欧美97爱| 久久综合激情| 欧美少妇一区二区三区| 91超碰碰在线| 中日韩免费看男女操逼大全| 综合网色| 日本熟妇一区二区三区| 欧美精品偷拍| 亚洲自拍97| 91人妻PORNY九色大屁股| 嗯嗯,好大,好爽,好骚| 97视频在线视频| 中国熟女老妇仑乱一区二区三区| AV大香蕉| 亚洲欧美激情小说| 国语av最新自产拍在线观看| 欧美日韩国产男人| 日本αv| 性爱动态120秒| 国产精品对白自产拍| 免费一级特黄特色大片在线观看看| 色一射色一射| 亚洲天堂加勒比| 国产精品久久久鸭无码的功能| 亚洲大色堂| 日本视频在线中文字幕| 欧美视频在线第3页| 夜夜欢天天干| www.婷婷| 欧美日韩在线小说 | 97久久久久久久久久| 国产亚洲中文不卡二区| 亚av顶级裸体一区二区三区四区五区 | 思思热在线cao| 欲射影视| 日本成人A片免费看| 日韩av色图综合| 99久久精品无码一区二区毛片免费| 麻豆天美久久91| 性色亚洲| 中出789在线视频| 女优视频第10页| 超碰精品国产无码| 国产精品片| 亚州色交| 日韩成人性日韩成人性爱视频在线免费观看| 久久久久久久人妻| 清纯唯美亚洲综合| 男人的天堂2018.| 亚洲āv网址在线观看| www.操| 国产色综合亚洲色综合吹潮| 亚洲综合小视频小说在线观看| 天天爽夜夜爽夜夜爽精| 亚洲大胆人体av| 偷看洗澡一二三区美女| 9丨久久九九九| 成人熟女视频一区二区三区| 91精品女厕偷拍视频| 亚洲综合大片| 亚洲 日韩 欧美 国产综合体| 欧美日韩1234| 欧美日韩大陆黑人少妇99| 亚洲人妻中文高清| 九九久久久| 中文字幕欧美日韩三级| 久久精品一区| 黄片在线免费在线观看| 91天天综合日韩欧美| 久久精品一区| 精品成人av一区二区三区在线| 黄页av| 一区二区三区无卡视频在线观看| 日韩av在线免费网站| 9Ⅰ老熟女| 91精品婷婷国产综合久久竹菊| 性做久久久久久免费观看软件 | 性做久久久久久免费观看软件| 欧美加勒比| 色综合99999| h在线看免费版在线看| 操人人| 日天天九九天堂666| 超碰在线974| 久久香蕉国产线看观看猫咪av| 久久久九九九| 五月天人妻综合| 嗯~啊~快点 死我视频| 大香蕉免费乱伦视频| 97香蕉网| 久九九九九九九九热| 婷婷情色五月天| 日本色色色| av在线一区二区三区| 亚洲国产丝袜熟女av| 激情文学小说一区二区| 天天综合香 ld视频| 色婷婷亚洲婷婷| 无码WWW免费视频网站| 91亚州| 欧美日综合| A一级色女| 国精品一区二区三| 婷婷五月天补不补| 国产精品老师| 日韩精品1区2区中文字幕| 午夜成人爽爽爽爽A片李冰冰| yazhououmeizongya| 操亚州| 草蕉影视亚洲无码| 97超碰国产亚洲精品资源| 欧美网站免费| 国产亲戚伦亲在线| 国产一级特黄大片处女| 国内毛片热久久思思热| 夜夜爽夜夜爽| 亚洲丝袜诱惑| 亚洲 日本 不卡| 97久操| 久草色在线观看| 久9综合在线| 韩日自拍| 疯操AV| 精品一区二区久久| 国产外初女出血视频| 加勒比伊人影院| 久久动漫精品视频这里只有精品| 成人天天看站长推荐| 内射中出日韩在线观看视频| 天堂九九九九九九九九九| 黑人精品欧美一区二区蜜桃| 搡老女人老91妇女熟女| 亚洲清纯唯美| 亚洲精品国产熟女久久久| 色臀aV| 九热超碰| 天美传媒精品久久视频| 国产精品97视频| 男人天堂2030| 天天干人人看综合| 色狠狠综合噜一二三区| 久操国产在线| 欧美综合网| 韩国一级做a久久久久| 亚洲无线观看久久| 99亚洲精品| 国产成年免费大片黄在线观看| 乳欲人妻办公室奶水| 午夜电影在线观看无码专区| 国产超碰人人爽人人做| 99热伊人| 精品人妻一区二区三区-国产精品| 天堂麻豆天美| 视频黄站| 啊啊啊爽爽| 欧美性爱日韩高清| 久久直播国产| 中文字幕精品一区二区精品| 91九久| 蜜臀久久99精品| 国产丝袜一区二区三区| 葡萄牙性视频一二区| 黄色片A级一区二区三区| 三级网色| 日本久久久久久久久| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 久久超碰国产一区二区三区| 国产免a费看黄片在线| 色情综合| 日本一片一区| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 97超碰久久| 国产精品毛片?v一区二区三区| 一区二区三区视频在线观看免费| 又黑又大又粗| 九热超碰| 精品人妻视频入口| 亚洲第一在线视频| 人人综合| 欧美性夜| 国产美女mm131爽爽爽爽| 亚州精人品大香蕉| 超碰综合97在线| 亚洲码在线中文在线观看| 在线人人人人人人精品超 | 久久久啊啊啊| 18禁美女裸体无遮挡啪啪| 美中韩AV综合网| 久久久96精品| 午夜超爽| 国产九月婷婷| 欧洲站一级二级三级h| 日夜干射色啊| 亚洲91在线| 日韩不卡a级视频专区| 色眯眯射| 精品一区二区三区丰满熟女-亚洲欧美一区 | 国产精品探花在线| 久久亚洲天天做| 91骚熟女| 激情综合五月| 夜夜骑日日| 操逼啊啊啊91| www.高清无码诱惑一区.com | 国产视频三区四区| 国产9l 大屁股| 粉嫩av在线一区二区| 四虎国产成人精品免费一女五男| 精品视频一二三中文| 中文字幕在线免费观看视频| 亚州欧美一区| 国产女人与拘做受视频免费| 午夜啊啊啊| se吧提供91精品国产91久久久久久| 99这里有精品视频| AV天堂因数| 99热婷婷| 97日亚洲欧美| 天天操天天插| 91制服丝袜中文字幕| 99在线观看| 欧美丝袜中文字幕07在线| 色噜噜人妻丝袜a∨先锋影| 一本久久精品中文字| 1人人看人人摸人人操| 久艹伊人精品综合在线| 国产主播福利| 亚洲综合性感在线| 岛国福利在线精品播放| 青青青青草av在线观看| 偷窥自拍亚洲色图| 精品九九| 亚洲人妻熟妇三十三区| 一区二区精品日韩欧美在线观看| 伊人青青草久久| 久久综合国产精品国产| 好爽免费视频,| 日韩成人性爱电影在线播放| 91亚.色| 色墦五月丁香| 97综合久久| 日本999精品视频| 日韩精品在线观看观看| 日韩中文9| 色欲天天综合网| 国产精品网址| 第四色色综合91| 亚洲精品尤物yw在线影院| 欧美大干日韩| 免费精品99| 国产精品福利资源在线尤物| 欧美色图成人网一区二区 | 欧美自拍网| 欧美日韩高潮喷水91| 一级做受视频免费是看美女| 啊啊啊97视频| 亚洲AV成人无码一区二区三区在线观看| 外国免费性情大片| 大香蕉伊人网WWWn0n| 色综合天天| 亚洲 日本 不卡| 天天亚洲综合| 人妻乱仑一区二区三区| 91欧美综合| 啊啊啊在线观看免费视频| 国产午夜激片Av毛片不卡| 67914在线兔费成人视频| 天天影视网综合少妇| 99re公开精品免费视频| 日本不卡在线二区三区| 躁躁日曰躁2020| 婷婷久久五月天| 最新av网站在线观看| 亚洲丝袜二区在线| 久久熟妇五十路一区| 久久老子无码午夜伦不卡| 2017av无码免费无线播| 视频在线观看青青99国产| 黄色大片一区二区密桃丝袜| 操逼片中文| 亚洲精品久久久久久| 黄片无码在线制服| 97日韩欧美| 亚洲美女AV无码| 九热中文字幕| 屁屁影院一区二区三区国产| 久久五月综合| 久噜噜| 一区二区高清视频| 免費黃色視頻觀看一| 国产伦精品一区二区三区视频女| 久久久婷婷| 美女久久久久久久久久久| 日本操逼视频导航| 久久久穴999| 欧美第一页| 人妻熟女字幕一区二区| 久久久久极品| 午夜福利免费精品视频| 国产高清不卡视频| 亚洲色图欧美一区二区不卡| 91人妻Pr| 果冻传媒A片麻豆熟妇人妻| 日韩av影片在线观看| 人妻天天爽夜夜爽2| 天堂种子在线www网资源| 国产情色第一第二页在线观看| 超清福利精品视频在线| 一区二区三区日韩欧美| 欧美国产精品久久九九| 一区=区三区视频| 国产久久免费精品视频| 很很很很操| 久草视频分类在线| 97 国产精品| 久久久久免费少妇| 一级片视频啪啪| 亚洲自拍欧美色综合| 亚洲日韩精品在线播放| 四虎国产精品永久在线囯在线| 97干天天| 欧美99热| 蜜乳成人AV| 成人区人妻精品一| 韩国三级三级BD在线| 90后性网国产欧美| 久久久999| 亚精品无码毛片一区二区三区| 大色综合网| 精品国产三级av韩国在线| 丰满欧美放荡少妇在线| 久久超碰97中文字幕| 偷拍超碰| 中文字幕一区二区韩| 日本媚薬中文字幕在线| 亚洲日韩欧美一区二区| 欧美黄色图片| 青青草视频久久| 久久久久成人亚洲国产| 天天看天天在线精品| 亚洲天天操| 精品无码一区二区三区| 性爱AV天堂| 97超碰久久色| 美日韩在线不卡人妻| 美女淫穴| yirendaxiangjiashipin| www.99热| 国产精品交换一区二区| 9色在线| 久久婷婷视频| 欧美色偷拍| 嗯啊啊啊轻点视频| 综合色图,成人综合网| 人妻少妇精品一区二区三区| 小少妇| 色五月婷婷麻豆在| 97视频网站在线观看| 啊啊啊不要好疼视频| 91丨九色丨国产打屁股| 婷婷五月天补不补| 国产精品对白内射| 色五月69夫妻| 一区,二区,三区视频| 素人无码中文字幕| 久9爱经典视频| 97超碰美女| 亚洲国产av中文字幕久久| 精品国产乱码久久久久久口爆网站| 69精品久久久久中文字幕| 激情五月天色播| 99国产精品在线观看| 大干人妻| 秋霞一级A片黄色视频| 国产粉嫩出水在线播放| 男人天堂一区二区| 中文字幕第23区| 新怡红院| 日本激情免费大片| 亚洲精品男人的天堂| 精品一区二区三区四区女| 久久激情四射婷婷丁香五月天| 96久久久| 日韩无码专区| 久久精品高清无码一区| 青娱乐休闲视频在线观看| 在线看片国产精品每日更新| 三级三级三级日本99| 日韩欧美中文字| 免费无码婬片AAAA片直播色戒| 一区二区三区精品久久| 婷婷美人网| 91 欧美| 九九AV| 97这里有精品| 国产玖玖| 色臀av| 国产天美欧美| 天堂成人网| 看看小穴| 四虎午夜影院| 亚洲国产综合久久久性感熟妇| 欧美97se| 一块操欧美| 久久久久久久9| 操我啊啊啊啊啊| {男男暴菊gay无套网站| 嗯嗯啊啊视频一区二区三区| 在线欧美69V免费观看视频| 亚洲青青草| 午夜人妻精品综合在线| 97超碰色情| 久久久久久久九九九九九九| 日韩免费在线观看不卡| 超碰综合色| 操逼片中文| 欧美97免费| 久久久久密| 亚洲淫色网中文| wwwss在线观看| 交换娇妻呻吟声不停中文字幕| 神马影院午夜福利久久久| 综合色播| 秋霞无码av鲁丝片一区| 亚洲成人在线乱码色午夜| 日韩三级久久久| 国产强奸超碰AV| 精品日韩人妻精品一二三区| 天躁夜夜躁2021| 亚洲青色欧美| 99热这里只有精品地址| 综合亚洲欧美精品日韩?v| 2019亚洲男人天堂| 久久亚州高清| 2020国产精品| 一级久久久久久久久久久| 九九九热| 国产中出内射一区二区| 青青草久久在线| 天天看高清麻豆| 欧美日本天堂| 亚洲男人的天堂在线看| 另类图片五月| 狠狠狠狠狠狠| 巨爆乳肉感一区二区三区竹菊影视| 26uuu国产成人综合| 自怕偷自怕亚洲精品| 91精品国产综合久久久蜜臀酒店| 97久久国产精品| 国产精品高朝久久久久久久| 欧亚久久偷拍视频| 国产精品视频播放| 欧美一区二区成人一卡| 中文字幕天天操| 夜夜综合| 久久精品99| 香蕉视频精品亚洲一区二区三区在线播 | 欧亚在线视频| 五月综合激情网| 天色综合网| www.欧精品| 少妇天堂网络| 最新精品久久蜜桃 | 东北女人| 久久6热精品99视频| 亚洲精品 欧美精品| 玖玖爱伊人玖玖爱| 国产人妻久久精品一区二区三区| 丝袜视频网国产90| 男人久久天堂| 久久久久久亚洲Av无码| 日本色色色视频| 99九九久久| 亚洲 欧美 小说| 天天操熟妇| 国产一区二区三区免费视频在性观看| 人人操肉肉| 色婷婷五月综合| 亚洲综合夜色| 国产操逼网站亚洲一级黄色| 国产视频一区二区三区在线免费观看| 亚洲国产精品有声| 曰韩欧美国产传媒麻豆第一区| 超碰视97中文| 色网站导航大全| 久久久夜夜嗨免费视频| 青青草男人天堂| 成人26uuu| 青青草在线成人视频| 一本大道久| 久久精品毛片免费不卡| 91久久国产综合久久| 中文字幕 码精品视频网站| 国产成人91一区二区三区| 操逼视频亚洲| 干b在线性社区| 亚洲一区在线观看欧洲| 日本淫色网| 亚洲丝袜综合| 欧美有码激情视频一区二区三区| 大香交| 69精品久久久久中文字幕| 欧美精品偷拍| 性久久| 久久精品99| 91天堂色男人的天堂| 精品97精品97| 福利视频一区二区微拍| 人人操人人精品影片| 日本高清一区二区在线| 97伊人超碰| 九九玖玖精品| www.99色| 久久鲁夜| 岛国精品视频在线观看 | 久久久一区二区| 大香蕉免费乱伦视频| 校园春色美腿丝袜 | 九九夜精品九九在线| 精品久久久久av影院| 午夜视频久久久| 毛片99-全集电影手机免费观看完整-B029AV| 亚洲国产高清福利视频| 天天躁日日躁狠狠狠躁| 欧美熟妇乱码在线一区| 国产第25页在线观看| 中文字幕丰满子伦无码专区在线视频最新 | 亚洲 欧美 第一页| 天天综合欧美综合| 五月丁香社区婷婷日韩欧美精品影院| 国产精品久久泡妞网站| 老女人老91妇女老热女| 男人的天堂2010| 精品高清一区二区三区三州| 国产农村妇女毛片精品久久| 香蕉久久精品| 六月丁香婷| 国产成人一级av88| 国产精品高潮呻吟av久久4虎| 日韩久射综合| 久久人妇| 牛牛久久国产精品视频一二三| 人人天天欧洲| 熟女视频久久| 人妻aa| 破苞ⅩXXX性无码动漫无码|