我正在尝试编写一款文档测试工具,它可以检查文档字符串是否与实际函数签名相匹配(以及其他内容)。然而,我遇到了一个难题。我找不到一种方法来确定给定的函数是否属于一个类。
import inspect
def func1():
pass
class Foo:
def method(self):
pass
print(inspect.ismethod(func1)) # prints False
print(inspect.ismethod(Foo().method)) # prints True
print(inspect.ismethod(Foo.method)) # prints False - I want something that prints True here
问题在于方法通常将
self
作为它们的第一个参数,而这从未被记录在文档中(因为显而易见的原因)。这将导致我的测试失败,因为它们会遇到一个未记录的参数。我希望不必明确检查第一个参数是否称为
self
并跳过它,因为a)没有任何东西阻止函数具有称为self
的参数,b)名称self
本身是一种约定(因此您可以拥有一个名为this_is_definitely_not_self
的第一个参数的方法),并且我的工具将在任何情况下都失败。我也不能只初始化一个对象并检查函数是否是方法,因为这将在其__init__
中需要必需参数的任何类中失败。所以问题是,有没有办法在将函数绑定到对象之前检测函数是否是方法?还是我需要接受仅检查第一个参数是否称为
self
的事实?
.
。inspect.ismethod(Foo.method) or '.' in Foo.method.__name__
- Patrick HaughFoo.method.__name__
将会是method
。不过,__qualname__
可能更适合这个情况。 - internet_user