gpt4 book ai didi

python - 带有@deprecated 装饰器的函数的 lint 用法

转载 作者:行者123 更新时间:2023-12-03 14:21:29 24 4
gpt4 key购买 nike

是否有一个 linter 可以检测被 @deprecated 标记为已弃用的函数的使用情况?来自 deprecated 的装饰师包裹?
例如在

from deprecated import deprecated

def realfun():
print('Hey there')

@deprecated(reason="this is a test")
def myfun():
realfun()

if __name__ == "__main__":
myfun()
PYTHONWARNINGS="default::DeprecationWarning" python testfile.py 运行时,我会收到运行时警告但是 pylint , mypy , 和 flake8似乎(至少我如何运行它们)对调用 myfun 感到满意.

最佳答案

正如其他人提到的,您必须编写自定义 pylint检查器。它的工作方式是定义一个类,该类是 pylint 的子类。的 BaseChecker ,并定义发出哪些警告以及何时发出警告。
下面的代码正是这样做的。有点针对deprecated包的特定关键字参数,但只要有人使用名为 deprecated 的装饰器,它就应该可以正常工作。标记一个函数或类,并会发出 pylint警告 W0001 (随意更改它,例如更改为错误)。它还应提供信息性消息。
要使用它,请将代码添加到名为(例如)deprecated_checker.py 的文件中。 ,然后添加包含 deprecated_checker.py 的文件夹到 PYTHONPATH或将源添加到 pylint/checkers文件夹。然后你可以通过运行 pylint lint带有选项 --load-plugins=deprecated_checker .
有关编写自己的跳棋的更多信息,look here .

from astroid.nodes import Call, ClassDef, FunctionDef, Name
from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker


class DeprecatedChecker(BaseChecker):
__implements__ = IAstroidChecker

name = "no-deprecated"
priority = -1
msgs = {
"W0001": (
"%s %s is deprecated since version %s; reason: %s.",
"deprecated",
"Functions that have been marked via annotations as deprecated should not be used.",
)
}

def __init__(self, linter=None):
super().__init__(linter)

def visit_decorators(self, node):
# Check if there are decorators
if node.nodes is None:
return

# Figure out whether its a class or function
# that is deprecated, and get relevant info
if isinstance(node.parent, ClassDef):
parent_type = "Class"
elif isinstance(node.parent, FunctionDef):
parent_type = "Function"
parent_name = node.parent.name

# Check each decorator to see if its deprecating
for decorator in node.get_children():
if isinstance(decorator, Call):
if decorator.func.name == "deprecated":
version = "(not specified)"
reason = "not specified"
if decorator.keywords is not None:
for kw in decorator.keywords:
if kw.arg == "version":
version = f'"{kw.value.value}"'
if kw.arg == "reason":
reason = f'"{kw.value.value}"'
self.add_message(
"deprecated",
node=node.parent,
args=(parent_type, parent_name, version, reason),
)
elif isinstance(decorator, Name):
if decorator.name == "deprecated":
self.add_message(
"deprecated",
node=node.parent,
args=(
parent_type,
parent_name,
"(not specified)",
"not specified",
),
)

def register(linter):
linter.register_checker(DeprecatedChecker(linter))
如果你已经完成了所有这些,那么检查 stub 文件 tmp.py
from deprecated import deprecated


@deprecated
def fn_stmt():
pass

@deprecated(version="0.1.0")
def fn_version():
pass

@deprecated(reason="I'm mean")
def fn_reason():
pass

@deprecated(version="0.1.0", reason="I'm mean")
def fn_both():
pass

@deprecated
class ClassStmt:
pass

@deprecated(version="0.1.0")
class ClassVersion:
pass

@deprecated(reason="I'm mean")
class ClassReason:
pass

@deprecated(version="0.1.0", reason="I'm mean")
class ClassBoth:
pass
使用命令 pylint --load-plugins=deprecated_checker --disable=all --enable=deprecated tmp.py会得到你
************* Module tmp
tmp.py:5:0: W0001: Function fn_stmt is deprecated since version (not specified); reason: (not specified). (deprecated)
tmp.py:9:0: W0001: Function fn_version is deprecated since version 0.1.0; reason: (not specified). (deprecated)
tmp.py:13:0: W0001: Function fn_reason is deprecated since version (not specified); reason: I'm mean. (deprecated)
tmp.py:17:0: W0001: Function fn_both is deprecated since version 0.1.0; reason: I'm mean. (deprecated)
tmp.py:20:0: W0001: Class ClassStmt is deprecated since version (not specified); reason: (not specified). (deprecated)
tmp.py:24:0: W0001: Class ClassVersion is deprecated since version 0.1.0; reason: (not specified). (deprecated)
tmp.py:28:0: W0001: Class ClassReason is deprecated since version (not specified); reason: I'm mean. (deprecated)
tmp.py:32:0: W0001: Class ClassBoth is deprecated since version 0.1.0; reason: I'm mean. (deprecated)

-------------------------------------------------------------------
Your code has been rated at 5.29/10 (previous run: -2.35/10, +7.65)

关于python - 带有@deprecated 装饰器的函数的 lint 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64593550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com