import{_ as n,o as s,c as a,e as t}from"./app-Dq2hGnN2.js";const e={},o=t(`

def get_relative_path(base_path: str, target_path: str) -> str

获取相对路径

Args:

base_path: 基础路径

target_path: 目标路径
源代码
def get_relative_path(base_path: str, target_path: str) -> str:
    """
    获取相对路径
    Args:
        base_path: 基础路径
        target_path: 目标路径
    """
    return os.path.relpath(target_path, base_path)

def write_to_files(file_data: dict[str, str]) -> None

输出文件

Args:

file_data: 文件数据 相对路径
源代码
def write_to_files(file_data: dict[str, str]):
    """
    输出文件
    Args:
        file_data: 文件数据 相对路径
    """
    for (rp, data) in file_data.items():
        if not os.path.exists(os.path.dirname(rp)):
            os.makedirs(os.path.dirname(rp))
        with open(rp, 'w', encoding='utf-8') as f:
            f.write(data)

def get_file_list(module_folder: str) -> None

源代码
def get_file_list(module_folder: str):
    file_list = []
    for (root, dirs, files) in os.walk(module_folder):
        for file in files:
            if file.endswith(('.py', '.pyi')):
                file_list.append(os.path.join(root, file))
    return file_list

def get_module_info_normal(file_path: str, ignore_private: bool) -> ModuleInfo

获取函数和类

Args:

file_path: Python 文件路径

ignore_private: 忽略私有函数和类

Returns:

模块信息
源代码
def get_module_info_normal(file_path: str, ignore_private: bool=True) -> ModuleInfo:
    """
    获取函数和类
    Args:
        file_path: Python 文件路径
        ignore_private: 忽略私有函数和类
    Returns:
        模块信息
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        file_content = file.read()
        tree = ast.parse(file_content)
    dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')
    module_docstring = ast.get_docstring(tree)
    module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')
    for node in ast.walk(tree):
        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
            if not any((isinstance(parent, ast.ClassDef) for parent in ast.iter_child_nodes(node))) and (not ignore_private or not node.name.startswith('_')):
                if node.args.args:
                    first_arg = node.args.args[0]
                    if first_arg.arg in ('self', 'cls'):
                        continue
                function_docstring = ast.get_docstring(node)
                func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))
                module_info.functions.append(func_info)
        elif isinstance(node, ast.ClassDef):
            class_docstring = ast.get_docstring(node)
            class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])
            for class_node in node.body:
                if isinstance(class_node, ast.FunctionDef) and (not ignore_private or not class_node.name.startswith('_') or class_node.name == '__init__'):
                    method_docstring = ast.get_docstring(class_node)
                    def_type = DefType.METHOD
                    if class_node.decorator_list:
                        if any((isinstance(decorator, ast.Name) and decorator.id == 'staticmethod' for decorator in class_node.decorator_list)):
                            def_type = DefType.STATIC_METHOD
                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'classmethod' for decorator in class_node.decorator_list)):
                            def_type = DefType.CLASS_METHOD
                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'property' for decorator in class_node.decorator_list)):
                            def_type = DefType.PROPERTY
                    class_info.methods.append(FunctionInfo(name=class_node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in class_node.args.args], return_type=ast.unparse(class_node.returns) if class_node.returns else 'None', docstring=method_docstring if method_docstring else '', type=def_type, is_async=isinstance(class_node, ast.AsyncFunctionDef), source_code=ast.unparse(class_node)))
                elif isinstance(class_node, ast.Assign):
                    for target in class_node.targets:
                        if isinstance(target, ast.Name):
                            class_info.attributes.append(AttributeInfo(name=target.id, type=ast.unparse(class_node.value)))
            module_info.classes.append(class_info)
        elif isinstance(node, ast.Assign):
            if not any((isinstance(parent, (ast.ClassDef, ast.FunctionDef)) for parent in ast.iter_child_nodes(node))):
                for target in node.targets:
                    if isinstance(target, ast.Name) and (not ignore_private or not target.id.startswith('_')):
                        attr_type = NO_TYPE_HINT
                        if isinstance(node.value, ast.AnnAssign) and node.value.annotation:
                            attr_type = ast.unparse(node.value.annotation)
                        module_info.attributes.append(AttributeInfo(name=target.id, type=attr_type, value=ast.unparse(node.value) if node.value else None))
    return module_info

def generate_markdown(module_info: ModuleInfo, front_matter: Any) -> str

生成模块的Markdown

你可在此自定义生成的Markdown格式

Args:

module_info: 模块信息

front_matter: 自定义选项title, index, icon, category

Returns:

Markdown 字符串
源代码
def generate_markdown(module_info: ModuleInfo, front_matter=None) -> str:
    """
    生成模块的Markdown
    你可在此自定义生成的Markdown格式
    Args:
        module_info: 模块信息
        front_matter: 自定义选项title, index, icon, category
    Returns:
        Markdown 字符串
    """
    content = ''
    front_matter = '---\\n' + '\\n'.join([f'{k}: {v}' for (k, v) in front_matter.items()]) + '\\n---\\n\\n'
    content += front_matter
    for func in module_info.functions:
        args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]
        content += f"### ***{('async ' if func.is_async else '')}def*** \`{func.name}({', '.join(args_with_type)}) -> {func.return_type}\`\\n\\n"
        func.docstring = func.docstring.replace('\\n', '\\n\\n')
        content += f'{func.docstring}\\n\\n'
        content += f'<details>\\n<summary>源代码</summary>\\n\\n\`\`\`python\\n{func.source_code}\\n\`\`\`\\n</details>\\n\\n'
    for cls in module_info.classes:
        if cls.inherit:
            inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''
            content += f'### ***class*** \`{cls.name}{inherit}\`\\n\\n'
        else:
            content += f'### ***class*** \`{cls.name}\`\\n\\n'
        cls.docstring = cls.docstring.replace('\\n', '\\n\\n')
        content += f'{cls.docstring}\\n\\n'
        for method in cls.methods:
            if method.type != DefType.METHOD:
                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]
                content += f'### &emsp; ***@{method.type.value}***\\n'
            else:
                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]
            content += f"### &emsp; ***{('async ' if method.is_async else '')}def*** \`{method.name}({', '.join(args_with_type)}) -> {method.return_type}\`\\n\\n"
            method.docstring = method.docstring.replace('\\n', '\\n\\n')
            content += f'&emsp;{method.docstring}\\n\\n'
            content += f'<details>\\n<summary>源代码</summary>\\n\\n\`\`\`python\\n{method.source_code}\\n\`\`\`\\n</details>\\n\\n'
        for attr in cls.attributes:
            content += f'### &emsp; ***attr*** \`{attr.name}: {attr.type}\`\\n\\n'
    for attr in module_info.attributes:
        if attr.type == NO_TYPE_HINT:
            content += f'### ***var*** \`{attr.name} = {attr.value}\`\\n\\n'
        else:
            content += f'### ***var*** \`{attr.name}: {attr.type} = {attr.value}\`\\n\\n'
        attr.docstring = attr.docstring.replace('\\n', '\\n\\n')
        content += f'{attr.docstring}\\n\\n'
    return content

def generate_docs(module_folder: str, output_dir: str, with_top: bool, ignored_paths: Any) -> None

生成文档

Args:

module_folder: 模块文件夹

output_dir: 输出文件夹

with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md

ignored_paths: 忽略的路径
源代码
def generate_docs(module_folder: str, output_dir: str, with_top: bool=False, ignored_paths=None):
    """
    生成文档
    Args:
        module_folder: 模块文件夹
        output_dir: 输出文件夹
        with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
        ignored_paths: 忽略的路径
    """
    if ignored_paths is None:
        ignored_paths = []
    file_data: dict[str, str] = {}
    file_list = get_file_list(module_folder)
    shutil.rmtree(output_dir, ignore_errors=True)
    os.mkdir(output_dir)
    replace_data = {'__init__': 'README', '.py': '.md'}
    for pyfile_path in file_list:
        if any((ignored_path.replace('\\\\', '/') in pyfile_path.replace('\\\\', '/') for ignored_path in ignored_paths)):
            continue
        no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)
        rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
        for (rk, rv) in replace_data.items():
            rel_md_path = rel_md_path.replace(rk, rv)
        abs_md_path = os.path.join(output_dir, rel_md_path)
        module_info = get_module_info_normal(pyfile_path)
        if 'README' in abs_md_path:
            front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}
        else:
            front_matter = {'title': module_info.module_path.replace('_', '\\\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}
        md_content = generate_markdown(module_info, front_matter)
        print(f'Generate {pyfile_path} -> {abs_md_path}')
        file_data[abs_md_path] = md_content
    write_to_files(file_data)

class DefType(Enum)

attr FUNCTION: 'function'

attr METHOD: 'method'

attr STATIC_METHOD: 'staticmethod'

attr CLASS_METHOD: 'classmethod'

attr PROPERTY: 'property'

class FunctionInfo(BaseModel)

class AttributeInfo(BaseModel)

class ClassInfo(BaseModel)

class ModuleInfo(BaseModel)

var NO_TYPE_ANY = 'Any'

var NO_TYPE_HINT = 'NoTypeHint'

var FUNCTION = 'function'

var METHOD = 'method'

var STATIC_METHOD = 'staticmethod'

var CLASS_METHOD = 'classmethod'

var PROPERTY = 'property'

var file_list = []

var dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')

var module_docstring = ast.get_docstring(tree)

var module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')

var content = ''

var front_matter = '---\\n' + '\\n'.join([f'{k}: {v}' for (k, v) in front_matter.items()]) + '\\n---\\n\\n'

var file_list = get_file_list(module_folder)

var replace_data = {'__init__': 'README', '.py': '.md'}

var file_content = file.read()

var tree = ast.parse(file_content)

var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]

var ignored_paths = []

var no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)

var rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path

var abs_md_path = os.path.join(output_dir, rel_md_path)

var module_info = get_module_info_normal(pyfile_path)

var md_content = generate_markdown(module_info, front_matter)

var inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''

var rel_md_path = rel_md_path.replace(rk, rv)

var front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}

var front_matter = {'title': module_info.module_path.replace('_', '\\\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}

var function_docstring = ast.get_docstring(node)

var func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))

var class_docstring = ast.get_docstring(node)

var class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])

var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]

var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]

var first_arg = node.args.args[0]

var method_docstring = ast.get_docstring(class_node)

var def_type = DefType.METHOD

var def_type = DefType.STATIC_METHOD

var attr_type = NO_TYPE_HINT

var def_type = DefType.CLASS_METHOD

var attr_type = ast.unparse(node.value.annotation)

var def_type = DefType.PROPERTY

`,84),p=[o];function c(i,l){return s(),a("div",null,p)}const u=n(e,[["render",c],["__file","mkdoc.html.vue"]]),d=JSON.parse(`{"path":"/en/dev/api/mkdoc.html","title":"liteyuki.mkdoc","lang":"en-US","frontmatter":{"title":"liteyuki.mkdoc","order":1,"icon":"laptop-code","category":"API","description":"def get_relative_path(base_path: str, target_path: str) -> str 获取相对路径 Args: 源代码 def write_to_files(file_data: dict[str, str]) -> None 输出文件 Args: 源代码 def get_file_list(module_fol...","head":[["link",{"rel":"alternate","hreflang":"zh-cn","href":"https://vuepress-theme-hope-docs-demo.netlify.app/dev/api/mkdoc.html"}],["meta",{"property":"og:url","content":"https://vuepress-theme-hope-docs-demo.netlify.app/en/dev/api/mkdoc.html"}],["meta",{"property":"og:site_name","content":"LiteyukiBot"}],["meta",{"property":"og:title","content":"liteyuki.mkdoc"}],["meta",{"property":"og:description","content":"def get_relative_path(base_path: str, target_path: str) -> str 获取相对路径 Args: 源代码 def write_to_files(file_data: dict[str, str]) -> None 输出文件 Args: 源代码 def get_file_list(module_fol..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-08-21T09:59:21.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-21T09:59:21.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"liteyuki.mkdoc\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-08-21T09:59:21.000Z\\",\\"author\\":[]}"]]},"headers":[{"level":3,"title":"def get_relative_path(base_path: str, target_path: str) -> str","slug":"def-get-relative-path-base-path-str-target-path-str-str","link":"#def-get-relative-path-base-path-str-target-path-str-str","children":[]},{"level":3,"title":"def write_to_files(file_data: dict[str, str]) -> None","slug":"def-write-to-files-file-data-dict-str-str-none","link":"#def-write-to-files-file-data-dict-str-str-none","children":[]},{"level":3,"title":"def get_file_list(module_folder: str) -> None","slug":"def-get-file-list-module-folder-str-none","link":"#def-get-file-list-module-folder-str-none","children":[]},{"level":3,"title":"def get_module_info_normal(file_path: str, ignore_private: bool) -> ModuleInfo","slug":"def-get-module-info-normal-file-path-str-ignore-private-bool-moduleinfo","link":"#def-get-module-info-normal-file-path-str-ignore-private-bool-moduleinfo","children":[]},{"level":3,"title":"def generate_markdown(module_info: ModuleInfo, front_matter: Any) -> str","slug":"def-generate-markdown-module-info-moduleinfo-front-matter-any-str","link":"#def-generate-markdown-module-info-moduleinfo-front-matter-any-str","children":[]},{"level":3,"title":"def generate_docs(module_folder: str, output_dir: str, with_top: bool, ignored_paths: Any) -> None","slug":"def-generate-docs-module-folder-str-output-dir-str-with-top-bool-ignored-paths-any-none","link":"#def-generate-docs-module-folder-str-output-dir-str-with-top-bool-ignored-paths-any-none","children":[]},{"level":3,"title":"class DefType(Enum)","slug":"class-deftype-enum","link":"#class-deftype-enum","children":[]},{"level":3,"title":"attr FUNCTION: 'function'","slug":"attr-function-function","link":"#attr-function-function","children":[]},{"level":3,"title":"attr METHOD: 'method'","slug":"attr-method-method","link":"#attr-method-method","children":[]},{"level":3,"title":"attr STATIC_METHOD: 'staticmethod'","slug":"attr-static-method-staticmethod","link":"#attr-static-method-staticmethod","children":[]},{"level":3,"title":"attr CLASS_METHOD: 'classmethod'","slug":"attr-class-method-classmethod","link":"#attr-class-method-classmethod","children":[]},{"level":3,"title":"attr PROPERTY: 'property'","slug":"attr-property-property","link":"#attr-property-property","children":[]},{"level":3,"title":"class FunctionInfo(BaseModel)","slug":"class-functioninfo-basemodel","link":"#class-functioninfo-basemodel","children":[]},{"level":3,"title":"class AttributeInfo(BaseModel)","slug":"class-attributeinfo-basemodel","link":"#class-attributeinfo-basemodel","children":[]},{"level":3,"title":"class ClassInfo(BaseModel)","slug":"class-classinfo-basemodel","link":"#class-classinfo-basemodel","children":[]},{"level":3,"title":"class ModuleInfo(BaseModel)","slug":"class-moduleinfo-basemodel","link":"#class-moduleinfo-basemodel","children":[]},{"level":3,"title":"var NO_TYPE_ANY = 'Any'","slug":"var-no-type-any-any","link":"#var-no-type-any-any","children":[]},{"level":3,"title":"var NO_TYPE_HINT = 'NoTypeHint'","slug":"var-no-type-hint-notypehint","link":"#var-no-type-hint-notypehint","children":[]},{"level":3,"title":"var FUNCTION = 'function'","slug":"var-function-function","link":"#var-function-function","children":[]},{"level":3,"title":"var METHOD = 'method'","slug":"var-method-method","link":"#var-method-method","children":[]},{"level":3,"title":"var STATIC_METHOD = 'staticmethod'","slug":"var-static-method-staticmethod","link":"#var-static-method-staticmethod","children":[]},{"level":3,"title":"var CLASS_METHOD = 'classmethod'","slug":"var-class-method-classmethod","link":"#var-class-method-classmethod","children":[]},{"level":3,"title":"var PROPERTY = 'property'","slug":"var-property-property","link":"#var-property-property","children":[]},{"level":3,"title":"var file_list = []","slug":"var-file-list","link":"#var-file-list","children":[]},{"level":3,"title":"var dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')","slug":"var-dot-sep-module-path-file-path-replace-os-sep-replace-py-replace-pyi","link":"#var-dot-sep-module-path-file-path-replace-os-sep-replace-py-replace-pyi","children":[]},{"level":3,"title":"var module_docstring = ast.get_docstring(tree)","slug":"var-module-docstring-ast-get-docstring-tree","link":"#var-module-docstring-ast-get-docstring-tree","children":[]},{"level":3,"title":"var module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')","slug":"var-module-info-moduleinfo-module-path-dot-sep-module-path-functions-classes-attributes-docstring-module-docstring-if-module-docstring-else","link":"#var-module-info-moduleinfo-module-path-dot-sep-module-path-functions-classes-attributes-docstring-module-docstring-if-module-docstring-else","children":[]},{"level":3,"title":"var content = ''","slug":"var-content","link":"#var-content","children":[]},{"level":3,"title":"var front_matter = '---\\\\n' + '\\\\n'.join([f'{k}: {v}' for (k, v) in front_matter.items()]) + '\\\\n---\\\\n\\\\n'","slug":"var-front-matter-n-n-join-f-k-v-for-k-v-in-front-matter-items-n-n-n","link":"#var-front-matter-n-n-join-f-k-v-for-k-v-in-front-matter-items-n-n-n","children":[]},{"level":3,"title":"var file_list = get_file_list(module_folder)","slug":"var-file-list-get-file-list-module-folder","link":"#var-file-list-get-file-list-module-folder","children":[]},{"level":3,"title":"var replace_data = {'__init__': 'README', '.py': '.md'}","slug":"var-replace-data-init-readme-py-md","link":"#var-replace-data-init-readme-py-md","children":[]},{"level":3,"title":"var file_content = file.read()","slug":"var-file-content-file-read","link":"#var-file-content-file-read","children":[]},{"level":3,"title":"var tree = ast.parse(file_content)","slug":"var-tree-ast-parse-file-content","link":"#var-tree-ast-parse-file-content","children":[]},{"level":3,"title":"var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]","slug":"var-args-with-type-f-arg-0-arg-1-if-arg-1-else-arg-0-for-arg-in-func-args","link":"#var-args-with-type-f-arg-0-arg-1-if-arg-1-else-arg-0-for-arg-in-func-args","children":[]},{"level":3,"title":"var ignored_paths = []","slug":"var-ignored-paths","link":"#var-ignored-paths","children":[]},{"level":3,"title":"var no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)","slug":"var-no-module-name-pyfile-path-get-relative-path-module-folder-pyfile-path","link":"#var-no-module-name-pyfile-path-get-relative-path-module-folder-pyfile-path","children":[]},{"level":3,"title":"var rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path","slug":"var-rel-md-path-pyfile-path-if-with-top-else-no-module-name-pyfile-path","link":"#var-rel-md-path-pyfile-path-if-with-top-else-no-module-name-pyfile-path","children":[]},{"level":3,"title":"var abs_md_path = os.path.join(output_dir, rel_md_path)","slug":"var-abs-md-path-os-path-join-output-dir-rel-md-path","link":"#var-abs-md-path-os-path-join-output-dir-rel-md-path","children":[]},{"level":3,"title":"var module_info = get_module_info_normal(pyfile_path)","slug":"var-module-info-get-module-info-normal-pyfile-path","link":"#var-module-info-get-module-info-normal-pyfile-path","children":[]},{"level":3,"title":"var md_content = generate_markdown(module_info, front_matter)","slug":"var-md-content-generate-markdown-module-info-front-matter","link":"#var-md-content-generate-markdown-module-info-front-matter","children":[]},{"level":3,"title":"var inherit = f\\"({', '.join(cls.inherit)})\\" if cls.inherit else ''","slug":"var-inherit-f-join-cls-inherit-if-cls-inherit-else","link":"#var-inherit-f-join-cls-inherit-if-cls-inherit-else","children":[]},{"level":3,"title":"var rel_md_path = rel_md_path.replace(rk, rv)","slug":"var-rel-md-path-rel-md-path-replace-rk-rv","link":"#var-rel-md-path-rel-md-path-replace-rk-rv","children":[]},{"level":3,"title":"var front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\\\\\\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}","slug":"var-front-matter-title-module-info-module-path-replace-init-replace-n-index-true-icon-laptop-code-category-api","link":"#var-front-matter-title-module-info-module-path-replace-init-replace-n-index-true-icon-laptop-code-category-api","children":[]},{"level":3,"title":"var front_matter = {'title': module_info.module_path.replace('_', '\\\\\\\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}","slug":"var-front-matter-title-module-info-module-path-replace-n-order-1-icon-laptop-code-category-api","link":"#var-front-matter-title-module-info-module-path-replace-n-order-1-icon-laptop-code-category-api","children":[]},{"level":3,"title":"var function_docstring = ast.get_docstring(node)","slug":"var-function-docstring-ast-get-docstring-node","link":"#var-function-docstring-ast-get-docstring-node","children":[]},{"level":3,"title":"var func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))","slug":"var-func-info-functioninfo-name-node-name-args-arg-arg-ast-unparse-arg-annotation-if-arg-annotation-else-no-type-any-for-arg-in-node-args-args-return-type-ast-unparse-node-returns-if-node-returns-else-none-docstring-function-docstring-if-function-docstring-else-type-deftype-function-is-async-isinstance-node-ast-asyncfunctiondef-source-code-ast-unparse-node","link":"#var-func-info-functioninfo-name-node-name-args-arg-arg-ast-unparse-arg-annotation-if-arg-annotation-else-no-type-any-for-arg-in-node-args-args-return-type-ast-unparse-node-returns-if-node-returns-else-none-docstring-function-docstring-if-function-docstring-else-type-deftype-function-is-async-isinstance-node-ast-asyncfunctiondef-source-code-ast-unparse-node","children":[]},{"level":3,"title":"var class_docstring = ast.get_docstring(node)","slug":"var-class-docstring-ast-get-docstring-node","link":"#var-class-docstring-ast-get-docstring-node","children":[]},{"level":3,"title":"var class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])","slug":"var-class-info-classinfo-name-node-name-docstring-class-docstring-if-class-docstring-else-methods-attributes-inherit-ast-unparse-base-for-base-in-node-bases","link":"#var-class-info-classinfo-name-node-name-docstring-class-docstring-if-class-docstring-else-methods-attributes-inherit-ast-unparse-base-for-base-in-node-bases","children":[]},{"level":3,"title":"var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]","slug":"var-args-with-type-f-arg-0-arg-1-if-arg-1-else-arg-0-for-arg-in-method-args","link":"#var-args-with-type-f-arg-0-arg-1-if-arg-1-else-arg-0-for-arg-in-method-args","children":[]},{"level":3,"title":"var args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]","slug":"var-args-with-type-f-arg-0-arg-1-if-arg-1-and-arg-0-self-else-arg-0-for-arg-in-method-args","link":"#var-args-with-type-f-arg-0-arg-1-if-arg-1-and-arg-0-self-else-arg-0-for-arg-in-method-args","children":[]},{"level":3,"title":"var first_arg = node.args.args[0]","slug":"var-first-arg-node-args-args-0","link":"#var-first-arg-node-args-args-0","children":[]},{"level":3,"title":"var method_docstring = ast.get_docstring(class_node)","slug":"var-method-docstring-ast-get-docstring-class-node","link":"#var-method-docstring-ast-get-docstring-class-node","children":[]},{"level":3,"title":"var def_type = DefType.METHOD","slug":"var-def-type-deftype-method","link":"#var-def-type-deftype-method","children":[]},{"level":3,"title":"var def_type = DefType.STATIC_METHOD","slug":"var-def-type-deftype-static-method","link":"#var-def-type-deftype-static-method","children":[]},{"level":3,"title":"var attr_type = NO_TYPE_HINT","slug":"var-attr-type-no-type-hint","link":"#var-attr-type-no-type-hint","children":[]},{"level":3,"title":"var def_type = DefType.CLASS_METHOD","slug":"var-def-type-deftype-class-method","link":"#var-def-type-deftype-class-method","children":[]},{"level":3,"title":"var attr_type = ast.unparse(node.value.annotation)","slug":"var-attr-type-ast-unparse-node-value-annotation","link":"#var-attr-type-ast-unparse-node-value-annotation","children":[]},{"level":3,"title":"var def_type = DefType.PROPERTY","slug":"var-def-type-deftype-property","link":"#var-def-type-deftype-property","children":[]}],"git":{"createdTime":1724234361000,"updatedTime":1724234361000,"contributors":[{"name":"snowy","email":"snowykami@outlook.com","commits":1}]},"readingTime":{"minutes":5.03,"words":1508},"filePathRelative":"en/dev/api/mkdoc.md","localizedDate":"August 21, 2024","autoDesc":true}`);export{u as comp,d as data};