Python 检查函数是否属于类

Python 检查函数是否属于类,python,python-3.x,reflection,Python,Python 3.x,Reflection,我正在尝试编写一个文档测试工具,用于检查docstring是否与实际函数签名匹配(以及其他内容)。然而,我遇到了一些障碍。我找不到一种方法来判断给定的函数是否属于某个类 import inspect def func1(): pass class Foo: def method(self): pass print(inspect.ismethod(func1)) # prints False print(inspect.ismethod(Foo().me

我正在尝试编写一个文档测试工具,用于检查docstring是否与实际函数签名匹配(以及其他内容)。然而,我遇到了一些障碍。我找不到一种方法来判断给定的函数是否属于某个类

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
本身是一个惯例问题(所以你可以有一个第一个参数叫做
的方法,这个方法肯定不是self
),我的工具在这两种情况下都会失败。我也不能只是初始化一个对象并检查函数是否是一个方法,因为如果任何类在
\uu init\uu
中使用了必需的参数,那么这个方法就会失败

所以问题是,有没有办法在函数实际绑定到对象之前检测它是否是一个方法?或者我是否需要只检查第一个参数是否叫做
self

一个选项是。对于方法,这包括可以使用的类名。这是添加它的原因之一:

>

类、函数、方法、描述符或生成器实例的限定名称

有关此属性的详细信息,请参见

当然,由于在类定义期间设置了
\uuuuuu qualname\uuuuu
,因此,当函数动态添加到类中时,可能会出现误报。因此,这个答案基本上涵盖了函数是否已在类中定义的问题

因此,没有明确的方法来检测这一点,因为在类内部定义并通过类访问的函数与在类外部访问的函数没有区别(在大多数情况下,除了
\uuuuuuuu qualname\uuu

一个明智的做法是使用
\uuuu qualname\uuu
作为“快速”检查,查看函数是否已在类中定义,如果是
False
,则返回到使用签名(func)中的和
的“self”检查
self


你不可能涵盖所有情况,这是Python,我可以做几乎任何我想做的事情。据说我们都是成年人。但是。

当你迭代一个类的成员时,你知道作为函数的属性是该类的方法。你可以在函数名中查找
<代码>检查.ismethod(Foo.method)或Foo.method中的“.”。帕特里克
Foo.method.\uu\u name\uuuu
将只是
方法<代码>\uuuu qualname\uuuu
可能适用于此。@虽然这是真的,但如果您正在迭代一个类的成员,我希望每个测试在任意可调用项上工作,然后有一个单独的测试运行器类型实体来完成发现和迭代的工作。您最多可以,从语义上讲,检测函数最初是在类主体中定义的。就这样。你在这里试图解决的实际用例是什么?哎哟!这是一个令人讨厌的问题,我可以看到它导致了一些很难找到的错误。不确定在这种情况下,它是否比只检查
self
要好:\n在任何情况下都要进行投票@ChinmayKanchi是的,我可以看到检查
self
的方法也会导致肮脏的地方。我不相信有一种方法可以覆盖所有的边缘情况;看起来你需要结合各种方法。实际上,我可能会坚持检查
self
。由于这是一个文档测试工具,我认为我可以合理地假设,任何关心运行它的人,都会关心不要做出像重命名
self
:pPlus这样的愚蠢决定,我想我从未见过在未绑定函数中使用
self
或调用绑定方法的第一个参数的任意代码,除了
self
。我当然见过在运行时向对象/类添加方法的代码(甚至在自动生成测试时编写了一些代码)!