Как я могу аннотировать класс в Pypy? - PullRequest
2 голосов
/ 22 ноября 2010

Я использую 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, возникает исключение [translation:ERROR] TypeError: signature mismatch: func() takes exactly 2 arguments (1 given). Я заметил, что это возможно, потому что я еще не аннотировал аргумент self. Однако это self имеет тип A, так как я могу аннотировать класс?

Спасибо за чтение и ответ.

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

По сути, точка входа PyPy - это функция (обычно принимает sys.argv в качестве аргумента).Все, что вызывает эта функция (создание объектов, вызов методов), будет аннотировано.Нет способа аннотировать класс, так как скомпилированный код PyPy экспортирует его не как API, а как отдельную программу.

Возможно, вы захотите, например:

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

иличётное:

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

, в этом случае a является предварительно созданной константой.

1 голос
/ 22 ноября 2010

Вы хотите staticmethod или classmethod ?

...