Python 如何在pypy中注释类?

Python 如何在pypy中注释类?,python,annotate,pypy,Python,Annotate,Pypy,我正在使用pypy将一些python脚本翻译成C语言。 假设我有这样一个python类: class A: def __init__(self): self.a = 0 def func(self): pass 我注意到A.func是一个未绑定的方法,而不是一个函数,因此它不能被pypy翻译。所以我稍微修改了代码: def func(self): pass class A: def __init__(self):

我正在使用pypy将一些python脚本翻译成C语言。 假设我有这样一个python类:

class A:
    def __init__(self):
        self.a = 0
    def func(self): 
        pass
我注意到
A.func
是一个未绑定的方法,而不是一个函数,因此它不能被pypy翻译。所以我稍微修改了代码:

def func(self): 
    pass
class A:
    def __init__(self):
        self.a = 0
A.func = func
def target(*args):
    return func, None
现在
func
似乎可以被pypy翻译。但是,当我尝试
translate.py--source test.py
时,引发了一个异常
[translate:ERROR]TypeError:signature mismatch:func()正好使用2个参数(给定1个)
。我注意到这可能是因为我还没有注释
self
参数。然而,这个
self
有类型A,那么我如何注释一个类呢


感谢您的阅读和回答。

您想要的是a还是a?

基本上PyPy的入口点是一个函数(通常接受sys.argv作为参数)。此函数调用的任何内容(创建对象、调用方法)都将得到注释。没有办法对类进行注释,因为PyPy的编译代码不会将其作为API导出,而是作为独立程序导出

例如,您可能希望:

def f():
    a = A()
    a.func()
甚至:

a = A()
def f():
   a.func()

在这种情况下,a是一个预先构建的常量。

staticmethod和classmethod对我来说都是可以的,classmethod可能会更好如果你只是不关心自己,不需要对类做任何事情,请使用
staticmethod
。很抱歉,我没有说清楚。我确实关心自己。它必须是一个特定的类。我需要与Classic的成员交互如果你在方法中关心
self
,那么你就不能执行
A.func()
-你需要给它一个
A
实例作为第一个参数,例如
A.func(A())
。您了解Python做这些事情的基本方法吗?你的代码在CPython工作吗?是的,我理解。我只想检查函数
func
的正确性。由于python缺乏工具,我想先将我的函数翻译成C,然后检查C代码。因此,我并不关心
func
是类a的绑定方法还是仅仅是一个函数。
target()
函数的作用是什么?
translation:ERROR
适用于哪一行?我在代码中没有看到对
func()
的任何调用。错误与“注释”一个类有什么关系?不知何故,我并不奇怪您在将带有类的面向对象代码翻译成C语言时遇到困难,C语言是一种没有类类型的过程语言。仅供参考:注释器的主要目标是“注释”流图中出现的每个变量。注释根据对所有流图(每个函数一个)的整个程序分析,描述此变量在运行时可能包含的所有Python对象。“谢谢你,菲贾。我知道,当我从入口点调用函数时,该函数将被注释。但是,当我只调用该函数一次时,参数将成为生成代码中的常量。说出一个函数定义f(a):返回a+1。如果我在入口点调用它,比如
f(1)
,它将生成一个
2
,而不是一个函数
long pypy\u g\f(long a){returna+1}
,因此我必须调用它两次或更多次才能使事情正确。这有点复杂。所以我试图直接使用
translateshell.py
生成函数,结果我的问题TranslatorShell被弃用了。如果你想导出一些接口,有translator/goal/sharedpypy.py和translator/c/dlltool.py,这是你想要嵌入RPython程序的开始。例如,他们会给出一个合理的函数名。我用它将pypy嵌入到webkit中。