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

ARTICLE DETAIL

資訊詳情

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

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

MMCV 代碼規(guī)范完整指南:PEP 8、命名、docstring、類(lèi)型注解與 pre-commit 落地實(shí)踐 人工智能計(jì)算機(jī)視覺(jué)深度學(xué)習(xí)【免費(fèi)下載鏈接】mmcvOpenMMLab Computer Vision Foundation項(xiàng)目地址https://gitcode.com/gh_mirrors/mm/mmcv點(diǎn)擊查看免費(fèi)下載本文是 OpenMMLab 計(jì)算機(jī)視覺(jué)基礎(chǔ)庫(kù) MMCV 的代碼風(fēng)格官方指南對(duì)應(yīng)倉(cāng)庫(kù)文檔 docs/zh_cn/community/code_style.md的深度展開(kāi)版。它面向兩類(lèi)讀者一是準(zhǔn)備向 MMCV 提交 Pull Request 的貢獻(xiàn)者需要讓代碼通過(guò) pre-commit、CI 與 reviewer 的審查二是希望在項(xiàng)目?jī)?nèi)建立統(tǒng)一代碼規(guī)范的團(tuán)隊(duì)。讀完本文你將掌握 MMCV 所遵循的 PEP 8 與 Google 風(fēng)格取舍、命名與 docstring 的具體寫(xiě)法、類(lèi)型注解與 mypy 的使用方法以及 pre-commit 工具鏈的完整配置從而寫(xiě)出與倉(cāng)庫(kù)風(fēng)格一致、可維護(hù)、易審查的 Python 代碼。一、代碼規(guī)范的兩個(gè)標(biāo)準(zhǔn)與 MMCV 的取舍1.1 PEP 8 —— Python 官方代碼規(guī)范PEP 8 是 Python 官方的代碼風(fēng)格指南是 OpenMMLab 算法庫(kù)首選的代碼規(guī)范見(jiàn) docs/zh_cn/community/contributing.md 中代碼風(fēng)格一節(jié)。它主要覆蓋以下幾方面內(nèi)容代碼布局規(guī)定 Python 中空行、斷行以及導(dǎo)入相關(guān)的風(fēng)格。一個(gè)常見(jiàn)疑問(wèn)是當(dāng)代碼較長(zhǎng)無(wú)法在一行內(nèi)寫(xiě)完時(shí)何處可以斷行PEP 8 給出了明確的換行規(guī)則。表達(dá)式規(guī)定表達(dá)式中空格的使用方式。尾隨逗號(hào)當(dāng)列表較長(zhǎng)、無(wú)法一行寫(xiě)下而寫(xiě)成逐行列表時(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 ]命名、注釋、類(lèi)型注解這些內(nèi)容的詳細(xì)規(guī)范是本文后續(xù)章節(jié)的主體。1.2 項(xiàng)目?jī)?nèi)一致性?xún)?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)目?jī)?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è)置中通常沒(méi)有啟用 yapf 的ARITHMETIC_PRECEDENCE_INDICATION選項(xiàng)因而格式規(guī)范工具不會(huì)按照該推薦樣式強(qiáng)制格式化一切以項(xiàng)目實(shí)際配置為準(zhǔn)。打開(kāi)倉(cāng)庫(kù)根目錄的 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這些配置說(shuō)明yapf 基于 pep8 風(fēng)格isort 的每行長(zhǎng)度限制為 79 字符mmcv被標(biāo)記為 first party而 torch、numpy 等被標(biāo)記為 third party導(dǎo)入順序會(huì)自動(dòng)按標(biāo)準(zhǔn)庫(kù) → 第三方 → 本地模塊排列。1.3 Google 開(kāi)源項(xiàng)目風(fēng)格指南Google 開(kāi)源項(xiàng)目風(fēng)格指南Google Python Style Guide比 PEP 8 提供了更詳盡的指導(dǎo)包含語(yǔ)言規(guī)范和風(fēng)格規(guī)范兩個(gè)部分語(yǔ)言規(guī)范對(duì) Python 中許多語(yǔ)言特性異常、Lambda 表達(dá)式、列表推導(dǎo)式、metaclass 等進(jìn)行優(yōu)缺點(diǎn)分析并給出使用意見(jiàn)。風(fēng)格規(guī)范大部分約定建立在 PEP 8 基礎(chǔ)上同時(shí)有更細(xì)的約定如函數(shù)長(zhǎng)度、TODO 注釋、文件與 socket 對(duì)象的訪問(wèn)等。MMCV 推薦將 Google 指南作為開(kāi)發(fā)參考但不必嚴(yán)格遵照原因有二該指南存在 Python 2 兼容需求例如要求所有無(wú)基類(lèi)的類(lèi)顯式繼承object而在僅使用 Python 3 的環(huán)境中這一要求不必要按本項(xiàng)目慣例即可OpenMMLab 項(xiàng)目作為框架級(jí)開(kāi)源軟件不必對(duì)高級(jí)技巧過(guò)于避諱尤其是 MMCV但使用這些技巧前應(yīng)認(rèn)真考慮是否真的有必要并尋求其他開(kāi)發(fā)者的廣泛評(píng)估。需要特別留意的一處差異是包的導(dǎo)入Google 指南要求導(dǎo)入本地包時(shí)使用路徑全稱(chēng)且每個(gè)模塊單獨(dú)成行。這在 MMCV 中通常不必要也不符合項(xiàng)目開(kāi)發(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 # 最多向上回溯一層過(guò)多的回溯容易導(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)格式化代碼具體安裝與使用見(jiàn) 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中國(guó)用戶(hù)若因網(wǎng)絡(luò)問(wèn)題安裝失敗可使用國(guó)內(nèi)鏡像配置pre-commit install -c .pre-commit-config-zh-cn.yaml pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml倉(cāng)庫(kù)根目錄的 .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 語(yǔ)法、檢查未解決的合并沖突requirements-txt-fixer調(diào)整requirements.txt中包的順序double-quote-string-fixer / fix-encoding-pragma / pyupgrade統(tǒng)一引號(hào)、移除編碼聲明、升級(jí)為 Python 3 語(yǔ)法codespell檢查單詞拼寫(xiě)mdformat檢查并格式化 Markdown 文件配合 mdformat-openmmlabdocformatter格式化 docstring--in-place --wrap-descriptions 79check-copyright檢查文件版權(quán)頭針對(duì) mmcv、tests排除 mmcv/opsmypy靜態(tài)類(lèi)型檢查排除 tests 與 docs 目錄其中 C 和 CUDA 代碼遵循 Google C Style Guideclang-format 鉤子在配置中以注釋形式預(yù)留。如果提交的代碼不符合代碼風(fēng)格規(guī)范pre-commit 會(huì)發(fā)出警告并自動(dòng)修復(fù)部分錯(cuò)誤若想臨時(shí)繞開(kāi)檢查可在git commit時(shí)加上--no-verify僅用于臨時(shí)提交最終推送的代碼必須通過(guò) pre-commit 檢查。二、命名規(guī)范2.1 命名規(guī)范的重要性?xún)?yōu)秀的命名是良好代碼可讀性的基礎(chǔ)。基礎(chǔ)命名規(guī)范對(duì)各類(lèi)變量做約束使讀者能根據(jù)名字判斷它是一個(gè)類(lèi)、局部變量還是全局變量而優(yōu)秀的命名則要求作者對(duì)變量功能有清晰認(rèn)識(shí)與良好表達(dá)能力讓讀者僅憑名稱(chēng)即可理解其含義。2.2 基礎(chǔ)命名規(guī)范類(lèi)型公有私有模塊lower_with_under_lower_with_under包lower_with_under類(lèi)CapWords_CapWords異常CapWordsError函數(shù)方法lower_with_under_lower_with_under函數(shù) / 方法參數(shù)lower_with_under全局 / 類(lèi)內(nèi)常量CAPS_WITH_UNDER_CAPS_WITH_UNDER全局 / 類(lèi)內(nèi)變量lower_with_under_lower_with_under變量lower_with_under_lower_with_under局部變量lower_with_under注意盡量避免變量名與保留字沖突若不可避免可使用一個(gè)后置下劃線如class_盡量不要使用過(guò)于簡(jiǎn)單的命名約定俗成的循環(huán)變量i、文件變量f、錯(cuò)誤變量e除外不會(huì)被用到的變量可命名為_(kāi)邏輯檢查器會(huì)將其忽略。2.3 命名技巧良好的變量命名需保證三點(diǎn)含義準(zhǔn)確、沒(méi)有歧義長(zhǎng)短適中前后統(tǒng)一。# Wrong class Masks(metaclassABCMeta): # 命名無(wú)法表現(xiàn)基類(lèi)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常見(jiàn)的函數(shù)命名方法動(dòng)賓命名法crop_img,init_weights動(dòng)賓倒置命名法imread,bbox_flip注意函數(shù)命名與參數(shù)的順序保證主語(yǔ)在前、符合語(yǔ)言習(xí)慣check_keys_exist(key, container)check_keys_contain(container, key)還要避免非常規(guī)或未統(tǒng)一約定的縮寫(xiě)如nb→num_blocksin_nc→in_channels。三、docstring 規(guī)范3.1 為什么要寫(xiě) docstringdocstring 是對(duì)一個(gè)類(lèi)、一個(gè)函數(shù)功能與 API 接口的詳細(xì)描述有兩個(gè)功能幫助其他開(kāi)發(fā)者了解代碼功能方便 debug 和復(fù)用代碼在 Readthedocs 文檔中自動(dòng)生成相關(guān) API reference 文檔幫助不了解源代碼的社區(qū)用戶(hù)使用功能。3.2 如何寫(xiě) docstring與普通注釋不同規(guī)范的 docstring 有嚴(yán)格的格式要求以便 Python 解釋器與 sphinx 進(jìn)行文檔解析docstring 的基本約定見(jiàn) PEP 257。MMCV 參考格式為 Google 風(fēng)格同時(shí)結(jié)合了 OpenMMLab 自身慣例。以下按模塊、類(lèi)、方法三種場(chǎng)景給出標(biāo)準(zhǔn)格式。1. 模塊文檔代碼風(fēng)格規(guī)范推薦為每個(gè)模塊Python 文件編寫(xiě) docstring但目前 OpenMMLab 項(xiàng)目大部分沒(méi)有此類(lèi) 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. 類(lèi)文檔類(lèi)文檔是貢獻(xiàn)者最常編寫(xiě)的類(lèi)型。按照 OpenMMLab 慣例這里使用了與 Google 風(fēng)格不同的寫(xiě)法不使用 Attributes 描述類(lèi)屬性而是使用 Args 描述__init__函數(shù)的參數(shù)。Args 中遵照parameter (type): Description.格式描述每個(gè)參數(shù)的類(lèi)型與功能多種類(lèi)型可用(float or str)寫(xiě)法可以為 None 的參數(shù)寫(xiě)為(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)的主體類(lèi)中建議加入原論文鏈接如果參考了其他開(kāi)源代碼實(shí)現(xiàn)應(yīng)加入modified from直接復(fù)制了其他代碼庫(kù)實(shí)現(xiàn)則應(yīng)加入copied from并注意源碼的 License如有必要可通過(guò).. 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)無(wú)特殊含義一般表示字符串。其中單反引號(hào)的用法與 Markdown 不同需要多加留意。另外還有:obj:type 這種更規(guī)范的表示類(lèi)的寫(xiě)法鑒于長(zhǎng)度不做特別要求一般僅用于表示非常用類(lèi)型。3. 方法函數(shù)文檔函數(shù)文檔與類(lèi)文檔結(jié)構(gòu)基本一致但需要加入返回值文檔。對(duì)于較復(fù)雜的函數(shù)和類(lèi)可使用Examples字段加入示例如果需要給參數(shù)加入較長(zhǎng)備注可加入Note字段。示例最好能直接在 Python 交互式環(huán)境中運(yùn)行并給出對(duì)應(yīng)結(jié)果多個(gè)示例可用注釋分隔說(shuō)明。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 中加入說(shuō)明必要時(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ù)或返回值里帶有需要展開(kāi)描述字段的 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 文檔格式編寫(xiě)否則會(huì)產(chǎn)生文檔渲染錯(cuò)誤。在提交 PR 前最好生成并預(yù)覽文檔效果方法見(jiàn) 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語(yǔ)法規(guī)范參考 reStructuredText PrimerSphinx 官方文檔與 Example Google Style Python Docstringssphinxcontrib-napoleon 文檔。OpenMMLab 使用 pytorch_sphinx_theme 與 napoleon 擴(kuò)展見(jiàn) requirements/docs.txt 與 docs/zh_cn/conf.py將上述 Google 風(fēng)格的 docstring 自動(dòng)渲染為 API reference 頁(yè)面如 docs/zh_cn/api/ 下各模塊的 .rst 文件。四、注釋規(guī)范4.1 為什么要寫(xiě)注釋對(duì)于一個(gè)開(kāi)源項(xiàng)目團(tuán)隊(duì)合作以及社區(qū)之間的合作必不可少因此尤其要重視合理注釋。不寫(xiě)注釋的代碼可能過(guò)幾個(gè)月連作者自己也難以理解造成額外的閱讀和修改成本。4.2 如何寫(xiě)注釋最需要寫(xiě)注釋的是代碼中技巧性的部分。如果你在下次代碼審查的時(shí)候必須解釋一下那么你應(yīng)該現(xiàn)在就給它寫(xiě)注釋。對(duì)于復(fù)雜的操作應(yīng)該在其操作開(kāi)始前寫(xiě)上若干行注釋對(duì)于不是一目了然的代碼應(yīng)在其行尾添加注釋。Google 開(kāi)源項(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ī)則為了提高可讀性注釋?xiě)?yīng)至少離開(kāi)代碼2 個(gè)空格絕不要描述代碼。假設(shè)閱讀代碼的人比你更懂 Python他只是不知道你的代碼要做什么。Google 開(kāi)源項(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 語(yǔ)法開(kāi)發(fā)人員通常熟悉 Markdown便于交流理解如用單反引號(hào)表示代碼和變量——注意不要與 docstring 中的 reStructuredText 語(yǔ)法混淆# _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)格文檔給出了兩類(lèi)典型注釋場(chǎng)景復(fù)雜邏輯結(jié)構(gòu)對(duì)優(yōu)先級(jí)關(guān)系進(jìn)行說(shuō)明。例如 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)五、類(lèi)型注解5.1 為什么要寫(xiě)類(lèi)型注解類(lèi)型注解是對(duì)函數(shù)中變量的類(lèi)型做限定或提示為代碼的安全性提供保障、增強(qiáng)可讀性、避免出現(xiàn)類(lèi)型相關(guān)的錯(cuò)誤。Python 對(duì)類(lèi)型沒(méi)有強(qiáng)制限制類(lèi)型注解只起提示作用IDE 會(huì)解析注解并在調(diào)用代碼時(shí)給出類(lèi)型提示類(lèi)型注解檢查工具如 mypy則會(huì)根據(jù)注解對(duì)代碼中可能出現(xiàn)的問(wèn)題進(jìn)行檢查減少 bug 的出現(xiàn)。通常不需要注釋模塊中的所有函數(shù)按以下原則權(quán)衡公共的 API 需要注釋在代碼的安全性、清晰性和靈活性之間權(quán)衡是否注釋對(duì)于容易出現(xiàn)類(lèi)型相關(guān)錯(cuò)誤的代碼進(jìn)行注釋難以理解的代碼請(qǐng)進(jìn)行注釋若代碼中的類(lèi)型已經(jīng)穩(wěn)定可以進(jìn)行注釋。對(duì)于一份成熟的代碼多數(shù)情況下即使注釋了所有函數(shù)也不會(huì)喪失太多靈活性。5.2 函數(shù) / 方法類(lèi)型注解通常不對(duì)self和cls注釋。根據(jù)行寬有多種寫(xiě)法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)用場(chǎng)合與行寬有關(guān)建議結(jié)合 yapf 自動(dòng)化格式使用 def my_method( self, first_var: int, second_var: float ) - Tuple[MyLongType1, MyLongType1, MyLongType1]: pass # 引用尚未被定義的類(lèi)型 class MyClass: def __init__(self, stack: List[MyClass]) - None: pass類(lèi)型注解中的類(lèi)型可以是 Python 內(nèi)置類(lèi)型、自定義類(lèi)也可以使用typing提供的 wrapper 類(lèi)進(jìn)行裝飾。常用注解# 數(shù)值類(lèi)型 from numbers import Number # 可選類(lèi)型指參數(shù)可以為 None from typing import Optional def foo(var: Optional[int] None): pass # 聯(lián)合類(lèi)型指同時(shí)接受多種類(lèi)型 from typing import Union def foo(var: Union[float, str]): pass from typing import Sequence # 序列類(lèi)型 from typing import Iterable # 可迭代類(lèi)型 from typing import Any # 任意類(lèi)型 from typing import Callable # 可調(diào)用類(lèi)型 from typing import List, Dict # 列表和字典的泛型類(lèi)型 from typing import Tuple # 元組的特殊格式 # 雖然在 Python 3.9 中l(wèi)ist, tuple 和 dict 本身已支持泛型但為了支持之前的版本 # 我們?cè)谶M(jìn)行類(lèi)型注解時(shí)還是需要使用 List, Tuple, Dict 類(lèi)型 # 另外在對(duì)參數(shù)類(lèi)型進(jìn)行注解時(shí)盡量使用 Sequence Iterable Mapping # List, Tuple, Dict 主要用于返回值類(lèi)型注解5.3 變量類(lèi)型注解一般用于難以直接推斷類(lèi)型時(shí)# Recommend: 帶類(lèi)型注解的賦值 a: Foo SomeUndecoratedFunction() a: List[int]: [1, 2, 3] # List 只支持單一類(lèi)型泛型可使用 Union b: Tuple[int, int] (1, 2) # 長(zhǎng)度固定為 2 c: Tuple[int, ...] (1, 2, 3) # 變長(zhǎng) d: Dict[str, int] {a: 1, b: 2} # Not Recommend行尾類(lèi)型注釋 # 雖然這種方式被寫(xiě)在了 Google 開(kāi)源指南中但這是一種為了支持 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è)擁有泛型能力的映射類(lèi)mapping Mappingstr, float value: float example[a]另外可以利用TypeVar在函數(shù)簽名中指定聯(lián)動(dòng)的多個(gè)類(lèi)型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類(lèi)型注解檢查工具mypy 是一個(gè) Python 靜態(tài)類(lèi)型檢查工具。它會(huì)根據(jù)類(lèi)型注解檢查傳參、賦值等操作是否符合注解從而避免可能出現(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ù)和返回值賦值兩處的類(lèi)型錯(cuò)誤第 5 行同樣存在兩處類(lèi)型錯(cuò)誤但因?yàn)槭褂昧藅ype: ignore而被忽略——只有部分特殊情況才需要此類(lèi)忽略。MMCV 在提交代碼時(shí)要求補(bǔ)充類(lèi)型注解并通過(guò) 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 等鉤子全部通過(guò)若鉤子安裝被網(wǎng)絡(luò)中斷可重復(fù)執(zhí)行pre-commit run ...繼續(xù)安裝單元測(cè)試pytest tests通過(guò)全量測(cè)試至少保證修改模塊的測(cè)試通過(guò)例如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 語(yǔ)法渲染無(wú)誤檢查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]開(kāi)發(fā)中描述中說(shuō)明修改理由、修改內(nèi)容與影響并關(guān)聯(lián)相關(guān) Issue。遵守這套規(guī)范既能保證你的代碼與 MMCV 現(xiàn)有代碼庫(kù)高度一致也能讓代碼在 Readthedocs 上正確渲染為 API 文檔惠及所有社區(qū)用戶(hù)。贊分享人工智能計(jì)算機(jī)視覺(jué)深度學(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、類(lèi)型注解、命名規(guī)范與質(zhì)量工具實(shí)戰(zhàn)QUANTAXIS Python 代碼規(guī)范完全指南PEP 8、類(lèi)型注解、命名規(guī)范與質(zhì)量工具實(shí)戰(zhàn) 本文依據(jù)倉(cāng)庫(kù)文檔 doc/development/code s金融科技后端數(shù)據(jù)分析DeepChem 開(kāi)發(fā)規(guī)范指南從 pre-commit 到類(lèi)型注解的完整代碼質(zhì)量保障體系DeepChem 開(kāi)發(fā)規(guī)范指南從 pre commit 到類(lèi)型注解的完整代碼質(zhì)量保障體系 本篇技術(shù)指南以 DeepChem 官方開(kāi)發(fā)文檔中的 Coding C人工智能深度學(xué)習(xí)機(jī)器學(xué)習(xí)生物信息學(xué)科學(xué)計(jì)算Python 3編碼規(guī)范與最佳實(shí)踐PEP 8完全解讀指南Python 3編碼規(guī)范與最佳實(shí)踐PEP 8完全解讀指南 想要寫(xiě)出專(zhuān)業(yè)、易讀且符合行業(yè)標(biāo)準(zhǔn)的Python代碼嗎掌握PEP 8編碼規(guī)范是每個(gè)Python開(kāi)發(fā)者文檔教程上一篇告別氣候數(shù)據(jù)處理困境用sqlx構(gòu)建高效驗(yàn)證案例數(shù)據(jù)庫(kù)下一篇gh_mirrors/ove/overleaf代碼審查流程PR規(guī)范與自動(dòng)化檢查創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
翔田千里AⅤHD无码| 97色碰| silk lablo在线观看一区二区| 久久欲| 欧美,亚洲,日韩,v,天堂,手机在线观看 | www.一本大99| 午夜无码精品免费看性色| 久久久久96| 又大又长又爽| 日韩中文字幕在线视频观看| 婷婷超| 久久99精品九九久久久婷婷| 韩国轻伦国内自拍一区| 99这里有精品视频| 五月丁香久久| www.夜夜| 亚洲色9| 91狠婷| 久久鲁夜| 九九天堂| 操九九九九九九| 自拍鲍鱼一区在线高清观看免费| av无码av无码专区| 国产精品呦一区二区三区| 久久精品国产亚洲AV先锋| 春色综合免费| 激情啪啪视频| 新视频sss国产| 97操97色| 超碰天天久久79| 亚洲1区| 亚洲一级特黄大片在线播放91| 黑人猛交| 欧美97色| 91在线秘 男同| 人人做,人人操,人人摸| 高跟丝袜AV专区国产| 91精品女厕偷拍视频| 日韩在线地址一| 美女啊啊啊啊啊啊| 天天谢天天干| 日韩乱插| 嗯啊不要在线| 99r九九| 国产性刺激| 久久色一区| 日韩无码嘿咻黑热久| 婷婷五月天伊人| 久久香蕉影院| 无码欧美有限公司| 91老熟女老女人国产老太| 色九九九综合| 欧美se综合| 96久久久久| 女色综合| 91午夜无码| 岛国黄色大片网站| 操少妇很爽av| 欧美大片天天看| 啊啊啊啊好疼视频| 久久97| 日本操逼视频在线| 玖玖爱免费观看视频| 亚洲第一黄色av网站| 国产日韩欧美亚洲精品95 | 国产a级午夜毛片| 久久久精品国产亚洲AV无码| 久久久久久性爱视频| 91久久堂| 日产操逼| 亚洲一区二区精品福利| 国产熟女少妇一区| 日韩人人精品| 国产精品福利资源在线尤物| 加勒比久久综合网高清| 插入综合网| 好好的日:com久久九九| 欧美后入式| 亚洲性爱成人| 亚洲五月丁香花狠狠干一区二区三区 | 精品免费一区| 久久欧美性爱视频| 国产精品色哟哟| 91女优在线观看| 91美女网站| 欧美aa一级片| 老熟女91av| 99热欧美| 综合在线导航一区| 午夜久久一区二区无码中出| 超碰欧美COM| 狠狠久久手机视频精品| 婷婷在线视频| 久久一二三四五六七八九区| 3D污黄视频在线观看| 小草精彩毛片| 精品黄色电影| 婷色五月天| 走光一区92下载| 精品欧美不卡在线播放| 免费观看的av| 狠狠操狠狠燥| 国产在线视视频有精品| 日韩电影天堂视频二区三区| 国产野战露脸在线播放| 日本日日色视频| 伊人操你| 免费亚洲国产精品久久一区| 亚洲欧美在线观看无码| 厕所偷拍在线| 国产一级高清免费观看| 玖玖在线视频| 78精品| 伊人五月天| 新视频sss国产| 国产多人在线观看视频| 天天综合有色网| 久久 精品| 免费观看的av| 亚洲熟女综合网| 日本黄 R色 成 人网站| 伊人9| 成人a大片在线观看| AV高清一区| 高清肉丝中文无码| 丰满岳乱妇一区二区三区| 精品三级在线专区| 极品五月天噜噜| 网友自拍第1页| 曰韩精品九九无码| 偷拍 欧美 日韩| 亚洲不卡不卡中文字幕不卡| 探花一区二区三| 口爆欧美91| 色吧5亚洲| 有码人妻系列| 日韩精品免费高清视频在线| 一级黄碟| 在线观看十八禁| 国产精品白领在线观看| 2019AV天堂| 欧美老妇曰批的视频| 色娱乐色呦呦夜夜夜夜av| 在线无码操| 欧美视频一区二区三区| 99国产精品人妻人伦| 日韩成人性日韩成人性爱视频在线免费观看| www.超碰| 国产成人午夜视频网址| 偷拍欧美亚洲| 粘花网06av视频| 欧美另类精品xxxx| 97欧美| 中文字幕视频2区| 久久久久久亚洲中文| 人妻少妇无码| 激情文学 国产一二三aV| 粉嫩av在线一区二区| 中文字幕日韩情色| 精品国产乱码久久久兰草影视| 日韩成人性爱AV| 一区二区无码视频| 久久夜夜夜夜| 欧美制服网站美腿丝袜| 久久香蕉综合一本到3atv| 欧亚韩国999| 97色五月天完| 人人做人人妻人人夜视频| 密臀在线一区尤物| 后入福利视频| 在线综合 亚洲 欧美中文字幕| 日本操嫩b网| 色婷婷成人| 偷拍精品一区二区三区| 蜜臀久久99'精品久久久| julia在线观看久久| 影视综合无码少妇| 日本精品一区二区不卡| 超碰到97情色| 尤物视频偷拍免费| 福利一级版子| AND人妻系列| 一级啊性爱在线视频| 亚洲AV成人无码一二三久久| 免费观看一区| 亚洲人妻五月丁香婷婷| 九九九九九九免费视频| 九区国产| 99操| 成人无码专区精品视频| 在线观看AV不卡| 国产精品激情久久久久久久| 一起草日韩| dy888午夜老子影视达达兔| 国产中文字幕在线观看| 国产精品3| 亚洲男人天堂2016| 99蜜桃臀亚洲成人在线观看| 亚洲淫乱骚妇AV| 五月婷婷丁香| 婷婷五月天伊人| 不卡啪啪视频| 五月天婷婷小说| 亚洲精品中文字幕一区在线视频| 东京成人一区| 九九十八精品| 免费啊啊啊| 欧美亚洲第1页| 午夜呻吟欧美| 蜜桃精品视频一区二区三区| 日韩淫色网| 精品美女少妇一区二区三区| 欧美激情片一区二区| 亚洲另类色图片| 97人妻色| 图色综合网| 欧美精品 - 91爱爱| 91麻豆天美国产| 无码99| 四虎影视在线| 啊啊啊在线观看免费视频| 97视频7| 青青操在线亚洲视频观看欧美在线 | 欧美中字不卡| 97欧美资源| 久久国产乱子伦精品免费女,网站| 欧美78P| 成人怡红院| 四虎国产精品永久在线囯在线| 在线观看不卡一区二区三区| 免费看黄视频亚洲网站| 天天色播亚洲综合网站| 超碰人人色| 天天日天天色| 操美女人妻| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 开心五月婷婷激情| 天天综合网国产| 青青草视频久久久久| 久久超碰免费的| 97超碰中文| 日本一卡二区在线| 欧美一区二区一级岛国大片| 久久av成人无码免费| 天天日天天干天天整| 97人妻色| 日本孕妇孕交| 久久青青草在线视频| 内射老妇BBWX0C0CK| 免费人成在线观看网站品爱网| 国产三级中文有码在线视频| WWW4虎| 久久大陆| 91日韩| 国产理论视频在线播放| 盗摄 精品 另类 一区| 久操 高清| 色偷偷综合91久久噜噜| 欧美一区二区三区蜜桃| 欧美另类色| 亚洲天堂电影网| 啊啊啊操死我| 蜜桃无码AV一区二区| 伊人97色天使| 精品国产乱码久久久久久久久久毛片 | www黄片免费看com| 男人的天堂色偷偷青青草视频婷婷网| 色噜噜人妻av中文字幕| 一级毛片久久久久久久女人18| 久/久精品99看9| 鸥美极品| 国产日韩区| Julia在线播放亚洲久久| 色婷婷婷五月天激情四射| 加勒比综合在线| 天天操天天干一区二区| 抽查国产福利主播| 校园春色 欧美| 国模吧 一区二区三区| 91艹逼精品| 天天综合网网欲色| 97 亚洲 日韩 欧美 在线| 亚洲AV色图| 嫩草影院在线观看精品| 不卡一区视频| 又大又长又粗又爽又黄| 懂色AV中文| 亚洲一区日韩精品中文字幕 | 久夜视频| 欧洲乱码视频| 日韩人妻一区二区| 亚洲aw毛茸茸在线| 日韩成人私密一级精品av| 中文字幕精品一区二区精品| 婷婷综合伊人一区| 91ise欧美| 神马久久久久| 青青青操| 午夜a成v人电影| 国产又大又粗又长视频在线| 国产高清无码一区三区二区| 蜜臀在线看片| 狠狠色色| 羞涩视频| 91色伦综合| av绯色| 婷婷九月国产| 激情看片网站| 91色狼| 亚洲熟妇乱女区二区三区| 国产自制av蜜乳| 欧美亚洲20p| 成人午夜高潮av猛片| 福利风月五月天影院| 极品国产内射| 女上位精品在线| 男女激情黄色网址| 日韩有码中文字幕女同性恋| 人人操天天爽| 激情久久av一区av二区av| 激情内射| 日韩精品熟妇| 综合色啪| 国产欧美日韩一区二区三区| 51一区二区三区| 狠狠干妹子| 婷婷五月综合激情| 国产av激情无码久久天堂| 麻豆天美制片厂网站视频| 国语国产操逼伊人AV网| 一区二区三区国产在线播放| 蜜臀亚洲综合一二三四区| 六月丁香婷| 香蕉欧美| 美女上床网站| 亚洲欧美九九九| 青娱乐国产盛宴视频| 97在线视频观看免费| 95人妻爽爽人人做人人澡| 91啦人妻| 99999久久精| 加勒比日本在线| 久久老子无码午夜伦不卡| 84YTCOM性无码| 无码九九九九| 国产十八禁视频| 色啪网| 亚洲成aⅴ人片不卡无码| 人人澡人人澡人人| 91爰爱欧美| 五月丁香婷婷色| 精品人妻1区| 亚91网| 激情人妻另类| 夜夜嗨绯色| 欧洲综合视频| 91色艳| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 男人午夜天堂| 伊人9| 精品国产国产AV| 狠狠综合网| 欧美精品xxxwww| 久久亚洲国产成人| 蜜乳视频网站| 亚洲av综合伊人久久| 2020国产精品| 亚洲天堂中文字| 中文字幕久久婷婷丁香五月天| 日本不卡中文| 男女性扦B| 9超碰免费| 天天摸天天插天天日| 操人91| 日韩一级成人毛片免费观看| 国产极品美女高潮无套在线观看| 人人人摸人人| 日韩强奸av| 国产成人91一区二区三区| 日韩9区| 情色大香蕉| 后入式福利| 人妻人久久精品中文字幕| 91精品免费| 2017天天透天天通天天擦| 欧美成人色| 欧美激情黑人| 亚洲中文丝袜美腿诱惑字幕| 欧美亚洲特P| 国产精品一区在线播放| 国产免费内射视频| 97爱亚洲| 强被迫伦姧在线观看无码网站| 亚洲一区二区在线观看91| 国产日韩久久| 日韩精品一区二区高清| 亚洲国产成人福利在线观看| 国产性爱在线视频一区二区| 亚洲成人美女无吗| 大香蕉啪啪啪| 熟妇女人妻呻吟久久AV| 啊啊啊啊啊在线视频| 高跟伊人julia ann| 天天日天天屌天天操| 国产精品久久久久久久久久梁医生| 777超碰| 99色网| 极品综合| 亚洲偷拍自拍在线视频| 色999人与兽| 9热9热综合网| 久久超碰天天| 亚洲婷婷综合网| 欧亚性爱在线视频| 天天做天天爽| 久久久熟妇熟女国产| 老汉网| 97在线观看免费| 91岛国动作片| 国产亚洲美日韩Aⅴ中文字幕无码成人| av日韩在线观看电影| 激情小说五月天| 97色色色综合网站| 日韩综合第八区国产精品| 国产97在线 | 亚洲| 日日操免费视频| 在线中文字幕极品av| 深爱五月婷婷| 人妻少妇精品久久久| 人妻激情视频| 伊人久操| 丝袜天堂| 青青青青青手机视频| 欧美高清18A片| 日韩在线观看中文字幕视频| 东北老女人的激情视频| 日韩精品一二三| 久久中文字幕一区不卡| 丁香五月婷婷色| 久久精9| 91亚洲欧洲| 8050午夜少妇无码| 啊啊啊啊啊啊好湿好爽视频| 欧美色图99| 中文字幕在线观看永久| 欧美三级一级| 这里都是精品在线观看| 2019AV天堂| 亚洲AV无码乱码| 啊视频在线| 亚洲综合性网址| 蜜臀中文字幕| 欧美日韩丝袜 | 免费自拍三级综合| 欧美亚综合色图| 久久久极品| 福利视频一区二区微拍| 韩日男人的天堂| 夜夜爽夜夜爽| 激情婷婷丁香| 少妇激情一区二区三区视频| 国产又操| 五月天人妻综合| 萌白酱自拍视频| 美腿丝袜高跟网免费视频免费视频| 91精片| av天堂影视中文在字幕在线中文| 日日干日日摸| 大香蕉婷婷| 成人青青草原伊人| 伊人97超碰| 97视频在线观看免费高清| 亚洲国产日韩欧美熟妇在线| 高清无码学生妹高潮| 国产高清精品福利| 东京热AV男人的天堂| 日韩一区二区高清在线观看的| 蜜桃视频一区二区三区在线观看| 视频一区二区三区精品| 999 久久久| 久久综合国产精品国产| 国产成人精品午夜福利| 探花一区在线| 91丝袜视频在线观看| 激情一区二区三区在线观看| 无码人妻1727| 国产性刺激| 免费精品人妻一区二区三| silk lablo在线观看一区二区| 国产精品极品美女视频| 久久久天堂| 1024久久高清视频| 欧美日韩国产另类综合| 大香蕉色欲AV| 综合色播| 人妻无一区二区三区| 美女干逼2| 欧美性爱系列| 国产农村妇女精品| 天天日天天操VV| 激情视屏国产乱伦强奸| 欧美懂色综合网| 日本午夜福利视频| 天天色综亚洲91污| 天美精品原创av片国产| 操亚州| 色综合久| 三级色综合| 夜夜夜夜久久久久| 99九九久久| 熟女突然公开看18禁影片| 97天堂| 亚洲男人的天堂网| 日韩精品一二三四| 国产精品制服丝袜清纯唯美| 天天狂操夜夜狂日| 夜夜操一区二区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 欧美日韩天堂| 亚洲精品 大香蕉| 天天做日日做| 国产精品爆乳懂色蜜乳| 人妻丰满熟妇av无码区蜜桃| 九九热免费在线国产视频伊人五月| 国产大学生口爆吞精合集| 久草这里只有精品 | 人妻一区视频| 国产在线能看的你懂的| 久久久久久人体| 99www.bibizy香蕉资源国产一区二区三区高清 | 国产精品99精品视频网站| 一区二区三区男人的天堂| 国产AV天美| 九99久久| 午夜精品久久久久久久男人的天堂| 亚欧无码线免费观看视频| 国产黑白丝在线| 九九九九日本 | 亚洲污一污二| 国产视频一区二区在线| 色婷久久| 丁香五月激情综合国产| 天天色天天干天天射| 蜜乳中文字幕a在线| 久久精品28| 91狠狠狠| 久9久9久9久9久9久9| ai欧美亚洲小说| 中文一区二区婷婷视频| 蜜桃视频精品一区二区| 尹人大香蕉视频在线| 无套内射性感少妇视频| 国产超碰人人爽人人做| 男女激情黄色网址| 亚洲情色中文字幕一区| 无码免费精品高清| 午夜影美女日鸡鸡天天视频国产| 日韩免费高清大片在线| 射久久| 天堂亚洲精品| 97伊人超碰| 97在线日韩中文字幕| 亚洲黄色网址| 我爱大香蕉| 91婷婷| 色婷婷综合网站| 九九99精品| 黄网色一区二区三区四区精品| www.久久最新地址| 国产成人无码啪| 欧美呦呦性爱| 一区二区三区四区免费视频| 国产 v乱码一区二| 久久激情网| 九九久久精品| 欧美毛片在线网| 97综合在线观看| 北条麻妃99精品青青久久| 色色激情五月天| 大屁股熟女一区二区三区| 一牛一区二区三区久久| 欧亚日韩综合精品国产| 死我十八禁| 欧美黑人与女人91| 91色图| 国产丝袜美女在线一区| 亚洲欧美在线观看免费| 第一高清av中文字幕| 桃花色涩综合影院| 亚洲,欧美,春色,另类| 亚洲宅男天堂| 天美传媒在线一区| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 国产精品黄色三级av| www.99中文字幕| 91精品久久久久久77777| 婷婷中文字幕| 亚州男人的天堂| 国产中文字幕在线观看| 性色aV一区二区三区噜噜| 国产一区二区成人av在线播放| 国产av波波国产精品| 9久久精品| 黄色二级片网站| 日韩精品9区| 日韩猛交| 国产精品久久久久亚洲av| 先锋精品av色鲁| 香蕉久久精品| 好涩综合| 成人八戒网站| 最新加勒比丝袜在线| 麻豆人妻偷人精品无码视频| 九九九九九精品| 亚洲精品aa久久伊人| 97精品国产97久久久久久| 亚洲第一二区另类图| 久久精品无码专区| 园内精品自拍视频在线播放| 久久大香蕉手机高清| 久久熟女久| 超碰导航97| 韩国黄片aaaa| 婷婷五月天久久精品视频一区二区三区| 无码精品啪啪啪一区二区三区三州| 97免费在线观看视频| 中文字幕成人理论在线| 在线 亚洲 网爆 自拍| 伊人宅男大香蕉| 国产AV无码AV| 日本东京热大香蕉a片| 加勒比综合| 亚洲乱熟女一区二区三区大香蕉| 成人 日韩欧美一区| 欧美综合亚洲| 午夜福利精品| 日韩不卡码| 色吧91| 78m啪啪啪| 中国zzijzzijzzwww精品| 9九九九九视频在线观看| 欧美色蜜桃97| 男人的天堂一区三区| 久久久久无码一妻区| 欧美A片中文字幕| 99热超碰| 国产一级高清免费观看| 婷婷五月天网| 78超碰| 9 9精品一区二区三区| 亚洲色图8| 国产三级多多影院2022国产AA一级毛片无码| 91狠婷| 水滴偷拍| 精品一区二区三区蜜桃臀赵总| 国产日本顶级一区二区三区| 制服乱伦| 成人性交午夜免费片| 久操热| 丰满少妇精品一区二区| 福利在线观看一区二区| 婷婷久草| 色五月婷婷久久| 午夜啊啊| 九九热男人天堂| 欧美一级A一级a爱片久久| 久热色情精品| 日韩免费高清大片在线| AV一二区| 亚州免费啪啪视频| 夜夜骑日日| 婷婷日韩一区二区三区中文字幕在线| 国产精品农村妇女| 老女人日韩美91| 亚洲一区日韩精品| 蜜桃久久久久久久久久久久| 无码乱人伦中文视频| 黄色一区三区| 爽爽淫人网| 91精品人| 熟女久久久| 欧美视频在线视频免费va| 性色aV一区二区三区噜噜| 超AV色女| 国产91精品福利在线| 噜噜瑟| 久久精品欧美一区蜜桃| 国产精品网址| 亚洲精品国产拍免费91在线| 欧美三级免费伊人| 欧美强奸乱能| 屌逼麻豆| 国产精品一区二区手机看片| 青青草导航在线视频| 五月色丁香| 超碰97久| 亚洲和欧美裸体美女双飞视频| 国产精品视频白浆免费| 日韩成人私密一级精品av| 色天堂综合| 人人色97| 可能人人看人人摸| av黄图片在线观看| 97精品网站| 97色97好| 乱老女人一区二区视频| 久久久久久久九九九九九九| 色九九九九九九| 久久久久久久久久久久黄色| 亚洲高清无码免费观看视频| 人妻献身系列第54部| 91美女高潮| 亚洲精品骚逼| 六月婷婷五月丁香| 97视频在线播放| 九九九九一区| 先锋音影AV| 内射中出日韩在线观看视频| 欧美日韩第一页| 成人性爱av| 天天干人人看综合| 欧美色乱| 一区二区三区看视频| 九一综合网| WWW.加勒比人妻一区不卡.com| 五月天婷婷久久| 日本中文字幕在线视频| 欧美日韩另类在线| av在线播放国产一区| www.男人的天堂| 一区二区三区色综合| 欧美精品在线观看| 天天摸,夜夜摸| 亚洲激情av| 久久99午夜精品一区人妻| 色五天伊人| 国产又猛又粗又爽又黄| 黑人娇小av在线播放| 美女高潮国产高清| 另类欧美色| 青草精品视频一日本久久久久网站| 亚洲综合校园春色| 精品999日本| 日本中文字幕一区| 北条麻妃性愛视频| 成人热久久精品| 91久久午夜无码鲁丝片久久人妻| 亚洲乱色视频一区、二区在线| 青草视频在线看看看看看看看看看| 欧美αv.com| 国产一级不卡在线观看| 国产精品自在线发布| 性影在线视频| 黄色性爱网网| 一区二区三区精品视频| 亚洲Av无码成人精品国产| 97干综合网| 亚洲熟妇综合久久久久久| 极品久久久久久久久久久久久久| 99re这里| 日产成人久久| 外国免费性情大片| 色妇综合网| 强被迫伦姧在线观看无码网站| 国产偷人伦激情在线观看| 天堂69亚洲精品中文字| 欧美午夜视频免费观看| 播播亚洲小说亚洲| 日韩免费性爱视频在线观看| 嗯嗯啊啊视频在线看| 清柠毛片| 99久久婷婷国产综合精品草原| 天美麻豆精品视频99| 国产精品久久久视频| 亚洲限制级| 91天天美女| 亚洲欧美成人网站AAA| 日韩成人在线性爱视频| 欧美日本国产日韩激情视频| 国产成人www免费人成看片| 色九区| 天天欧美色| 综合久久99亚洲人妻中文在线| 青青草久草AV| 九九综合九九综合| 无码操逼网| 91 刺激在线| 1204av韩国| 人妻天堂网| 亚洲一区日韩精品| 去干网最新版| 日韩av三四区| 日韩91网| A级毛片在线看免费| 婷婷色播婷婷| 加勒比日本在线| 午夜美女诱惑电源网| 一级做受视频免费是看美女| 国产小u女在线观看| 内射日韩大臀美女| 国产欧洲精品亚洲午夜拍精品| 成人怡红院| 欧洲成人性爱视频| 欧洲天天在线| 伊人96在线| 99e久久国产精品| 久久草在线综合视频| 91色图片| 日本综合色图| 国产成人综合网| 97视频620| 伊人影院日本| 性爱综合网| 欧美亚洲综合999| 99婷婷一区二区| 嗯啊不要在线观看嗯啊| 欧美熟女丝袜| 亚洲欧洲自拍图片专区满春格| 另类专区在线观看| 亚洲涩图欧美| 嫩呦国产一区二区三区AV| 婷婷情色综合网| 人人综合| 日本操逼视频免费| AV电影在线播放| 旡码电影特区| 最近二区三区视频大全| 欧美1区二区三区公司| 久草福利在线资源站| 9精品在线| 国产成人超碰在线| 美日韩一卡二卡三卡免费人妻精品| 精品二区三四区五电影 | 欧美美女在线高潮999| 久草在线| 国内外色色色色色成人视频| 四虎免费在线播放| 激情接吻视频久久久久久| 久久精品国产久精国产| 国产精品探花色| 神马久久中文字幕| 韩国免费播放一级毛片| 99国产在线绯色一区| 欲香欲色| 操b网站亚洲无码| 国产区日韩区在线观看| 黄色成品网站| 久久久久久久强迫| 国产美女精品| 日韩黄色av中文字幕| AV99热18这里只有精品| 波多野42部无码喷潮在线观看| 欧美日韩少妇色情| 国产理论视频在线播放| 999 久久久| 亚洲AV无码国产精品久久久久 | 亚洲不卡一| 婷婷在线精品| 久久久三区二区一区| 国内毛片国产专区二| 校园春色美腿丝袜 | 久草精品热视| 成人无码在线超碰网| 亚洲人妖网| www国产天美久久久| 日韩丨制服丨中文|在线| 丰满的三级少妇欧美久久久| 九九九久久久W精品| 天堂九九九九九九九九九| 久久久97| 久久99精品九九久久久婷婷| 操逼逼福利视频| 四虎影视精品| 久久综合18p| 99久久e免费热视| 91综合无码| 国产精品乱人伊人网| 人妻 丝袜美腿 中文字幕| 夜色97| 91色碰| 国产99精品一区二区三区免费| 91模特在线观看| 又黄又爽在线观看视频 | 九九热九九热| 四虎影视永久在线免费| 亚洲乱熟女一区二区| 18一区二区三区| 亚洲天堂一区二区久久| 国产免费小视频| 观看免费区二区三区二| 天天日天天干天天整| 色香综合| 男人的天堂无码| 欧美亚男人的天堂| 久久亚洲AV无码专区国产精品| 欧美97色| 加勒比五月天| 亚洲aw毛茸茸在线| 最新日产中文在线麻豆| 亚州色交| 国产女同视频在线播放| 91黑丝在线| 丝袜视频网国产90| 久久av网| 青青草日本无码| 日韩女模中文造逼| 久久亚洲欧美中文字幕国语| 日韩无码第3页| 亚洲麻豆18发?| 国产精品suv一区| 激情婷婷丁香| 日韩黄色一区二区三区| 欧美不卡五十路| 深夜视频| 亚州国产成人精品女人久久 | 国产一区自拍欧美日韩| 九九热av| 97超色| 色噜噜人妻丝袜AV资源| 久久黄黄| 国模吧 一区二区三区| 久久伊人亚洲AV无码网站| 欧美性夜| 久热精品在线| 久久美国毛片| 都市久久精品激情亚洲| 少妇久久久久久久久| 99热国产精品| 欧美亚洲高清不卡| 磁力99AV| 欧美国产视频| 欧美熟女激情| 亚洲国产剧情少妇激情| 欧美操逼一二三区| 中文字幕在线日亚州9| 无码精品蜜桃一区二区三区ww| 久久久亚洲高清不打码| 超碰人人操97碰| 在线观看不卡一区二区三区| 一级做a爰片性色毛片久久| 国产久久久| 国内伊人久久久久久网站视频| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 午夜激情成人在线观看| 久久黄片国产一区二区| 日本操逼无码| 日本中文字幕不卡视频| 亚洲高清视频在线免费观看| 欧洲性爱无码区| 国产精品人妻无码久久久老鸭窝| 深夜福利黄片| www.久久制服糖| 日韩偷拍一区二区三区| 人人 操人人 操人人| 黑人精品XXX一区一二区| 国产色综合亚洲色综合吹潮| 亚洲一区中文字幕一区| 国产懂色精品国产av| 在线国产一区二区av| av日韩在线观看电影| 2018色综合天天操| 九九性视频| 久久久久无码| 欲射影视| 欧美综合传媒| 久久欧美激情| 性色亚洲| 国产自产一区视频在线| 久操热线| 麻豆精品久久久久久久| 91成人在线| 97在线无精品| 亚洲人妻五月丁香婷婷| 精品人妻一区二区三区四区石在线| 无遮挡男女激烈动态图| 乳欲人妻办公室奶水| 操逼网站视频漫画国产| 色99在线| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产精品国产拍高清AV| 神马久久久久眼| 狠狠图片青青草| 色与欲影视天天看综合网| 天天干18禁| 岛国片国产成人亚洲播放| 97色色视频| 性欧美天天| 91天美免费| 日本αv| 亚欧性爱ab| 亚州色图狠狠干| 欧美亚洲综合999| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 国产隔壁老王影院在线| 国产欧美日韩在线不卡第一页 | 亚洲精品一区二区三区新线路| 97精品第3页| 亚洲精品国产拍免费91在线| 百度百度日本操逼| 亚洲中文字母在线播放| 国产一级久久久| 欧美图片色五月天| 欧美一级美片在线观看免费| 亚洲h片在线免费观看| 精品少妇一区二区三区在线视频| 九九九九日本| 性高潮久久久久久久久久久| 18禁美女裸体无遮挡啪啪| 淫淫总合网| 十八禁电影伊人网| 日韩免费在线视频观看| av九九| 国产精品69久久久久孕妇欧美| 国内毛片热久久思思热| 9久久精品| 亚洲综合 欧美| 久久东京热久久| 国模精品一区二区三区苹果色戒 | 天天做天天爱天天爽| 伊人色综合欧美| 美女被啪到深处抽搐视频| 色色综合网站| 久久久久久久综合,国产| 人人操人人色人人摸| 厕所偷拍在线| 亚洲色欧美| 九九碰九九爱97超碰| 精久久久| 亚洲自拍天堂| 91AV天堂| 人人操人人插人人摸人人干| 啊啊啊啊视频免费| 欧美亚洲综合高清在线| 中亚精品极乱| 九九操久久国产免费视频| 日韩一级片在线看| 香蕉免费一区二区三区不读| AV在线性爱| 乱久久久| 午夜福利无毒不卡| 亚洲淫色网中文| 波多野42部无码喷潮在线观看| 人妻在线臀日韩| 91情色| 色婷婷狠狠18禁| 欧美综合色| 国产欧美一区激情交| 欧美韩国你懂得在线| 欧美激情视频在线一区| 欧美日韩免费专区在线| 91精品国产91久久青草| 色综合91| 久久产精品一区二区三区电影| 国产伦精品一区二区三区在线观 | 日本布卡一区二三区| 91成人精品在线播放| 亚洲亚洲亚洲天堂天堂| 五月天婷精品激情| 久久久久密臀一区二区| www.yeyecao| 东京热精品97综合网| 97综合| 久久久久亚洲精品| 亚洲二区精品在线观看| 情色五月天久久久| 国产成人亚洲精品无码古代早漏男| 啊啊啊啊啊啊啊网址在线观看| 91爆操视频| 青青草大香蕉视频| 大香蕉免| 亚洲成人性| 2017,超碰| 丝袜综合色图| 国产亚洲精品农村妇女 | 超碰免费人妻人人| 国产女人9999| 国产麻豆一级精品视频| 亚州一区二区| 久久精9| 无遮挡h肉动漫在线观看| 亚洲欧美不卡线| 330dv亚洲成年视频网| 熟妇操花| 五月亭亭六月丁香| 中国熟女91| 久久免费精彩视频| 欧美日韩另类在线| 狠狠色五月亚洲91| 日韩丝袜人妻AV| 加勒比在线视频一区二区三区| 97干在线视频| 91欧美成人色站| 国产AV超爽| 久久午夜鲁丝片| 搡老女人老91妇女熟女| 小草精彩毛片| 黑人无码一区二区| 97日韩| 国产乱不卡| 蜜桃不卡一区二区| 国产成人无码久久精品| 国产91av在线播放| 中文字幕福利视频一区二区三区在线观看| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 天天操天天7| 97欧美精品综合| 综合自拍| 搞中出久久| 亚洲欧美天堂| 人妻少妇久久中文| 超碰精品| 久操九九九九| 国产AV超爽| 美女午夜福利免费视频| 日韩免费中文字幕视频| 97天天操天天干| 欧美制服另类丝袜| 色婷五月| 国产精品一区av在线| 久一区久久蜜桃| 欧美综合色图片| 91久久国外网| 久久天天躁日日躁狠狠躁| 久久精品国产精品亚洲艾通辽熟妇 | 欧美亚男人的天堂| 丝袜 亚洲 偷拍| 爱射综合| 色就色综合| 国产强奸乱伦第1页| 一本色道人妻久久| 神马久久免费电影观看| 精品999日本| 超碰综合色| 成人天天看站长推荐| 91久青| 色哟哟国产精品免费网址| 小少妇| 2024人人操人人摸| 美女被艹尤物视频| 亚洲日韩成人性爱视频| 国产毛片在线| 亚洲一区日韩精品中文字幕| 亚洲欧美清纯| 亚洲天天自拍| 97视频免费在线| 色踪合AV| 白嫩妹子国产骚| 午夜视频久久久| 99蜜月精品久久| 国产夫妻性生活视频| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 国产自偷| 久久久久幕乱码| 3P丝袜熟女 色综合| 色臀AV| 33044男人的天堂深夜备| 久久久女人| 精品视频在线观看| 久草尤物| 人妻偷拍一区二区三区|