我正在使用PTVS程序集为Python库生成强类型绑定。我有一个ModuleAnalysis
的实例,我用它来执行有关Python代码中猜测类型的各种查询。
此时我偶然发现我的C#输出需要使用override
关键字明确标记所有覆盖方法。但是,我似乎无法确定如何确定其中一个父类是否已经有一个具有相同名称的成员,即被覆盖。
以下是我要转换的示例:
class Base:
def virt(self):
print("Base.virt")
class A(Base):
def virt(self):
super().virt()
def non_virt(self):
pass
在处理A的virt时,我试图这样做:
analysis.GetValuesByIndex("super()." + node.Name, node.Body.EndIndex)
此处ModuleAnalysis analysis
和FunctionDefinition node
。我还尝试了Body.StartIndex
和"super(A, self)." + node.Name
。
出乎意料的是,这没有结果。
答案 0 :(得分:1)
实现这一目标的最佳方法是查看类的MRO并检查每个基类定义。
这一系列步骤应该大部分时间都在工作 - PTVS不会假装进行静态分析质量类型推理,所以有很多情况下它会“放弃”(特别是当交叉时)模块导入开始变得复杂):
self
的类型(确保位置在函数范围内)ClassInfo.Mro
self
(应该是第一个),然后检查每个ClassInfo.ClassDefinition
节点以查看它是否包含该函数,或者BuiltinClassInfo.PythonType.GetMember()
是否为导入的定义