Как я могу аннотировать класс в 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):
        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, так как я могу аннотировать класс?

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


person huangcd    schedule 22.11.2010    source источник
comment
Для чего нужна функция target()?   -  person martineau    schedule 22.11.2010
comment
К какой строке относится translation:ERROR? Я не вижу никаких вызовов func() в коде. Какое отношение ошибка имеет к аннотированию класса?   -  person martineau    schedule 22.11.2010
comment
Почему-то я не удивлен, что у вас возникают трудности с переводом объектно-ориентированного кода с классами на C, который является процедурным языком без типа класса.   -  person martineau    schedule 22.11.2010
comment
К вашему сведению: из ‹codespeak.net/pypy/dist/pypy/doc /translation.html#annotator› Основная цель аннотатора — аннотировать каждую переменную, которая появляется на потоковой диаграмме. Аннотация описывает все возможные объекты Python, которые эта переменная может содержать во время выполнения, на основе анализа всей программы всех потоковых графов — по одному на функцию.   -  person martineau    schedule 22.11.2010


Ответы (2)


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

Например, вы можете:

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

или даже:

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

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

person fijal    schedule 22.11.2010
comment
Спасибо, фиджал. Я знаю, что когда я вызываю функцию из точки входа, эта функция будет аннотирована. Однако, когда я вызываю эту функцию только один раз, аргументы становятся константами в коде генерации. Произнесите функцию def f(a): return a + 1. Если я вызову ее в точке входа, например f(1), она сгенерирует 2 вместо функции long pypy_g_f(long a){return a + 1}, поэтому мне придется вызывать ее дважды или больше, чтобы все исправить. Это как-то сложно. Итак, я пытался сгенерировать функцию напрямую, используя translateshell.py, и это мой вопрос. - person huangcd; 23.11.2010
comment
translateshell в любом случае устарел. Если вы хотите экспортировать какой-либо интерфейс, есть переводчик/цель/sharedpypy.py и переводчик/c/dlltool.py, которые являются началом того, что вам нужно, если вы хотите встроить программу RPython. Например, они дадут разумные имена для функций. Я использовал это для встраивания pypy в webkit. - person fijal; 23.11.2010

Вам нужен статический метод или классовый метод?

person Chris Morgan    schedule 22.11.2010
comment
И статический метод, и метод класса подходят для меня, и метод класса может быть лучше - person huangcd; 22.11.2010
comment
Если вас просто не волнует self и вам не нужно ничего делать с классом, используйте staticmethod. - person Chris Morgan; 22.11.2010
comment
Извините, может быть, я не ясно выразился. Я действительно заботился о self. это должен быть определенный класс. Мне нужно взаимодействовать с членом класса - person huangcd; 22.11.2010
comment
Если вы заботитесь о self в методе, вы не можете сделать A.func() - вам нужно указать экземпляр A в качестве первого параметра, например A.func(A()). Вы понимаете основной способ Python делать эти вещи? Ваш код работает в CPython? - person Chris Morgan; 22.11.2010
comment
Да, я понимаю это. Я просто хочу проверить корректность функции func. Поскольку инструментов для Python не хватает, я хочу сначала перевести свою функцию на C, а затем проверить код C. Так что мне все равно, является ли func связанным методом класса A или просто функцией. - person huangcd; 22.11.2010
comment
Тогда мы подходим к главному вопросу: что именно вы подразумеваете под аннотацией? Вы имеете в виду то, что говорит PEP 3107, или что-то еще? - person Chris Morgan; 22.11.2010
comment
Нет, под аннотацией я подразумеваю функцию, предоставляемую pypy. Он указывает тип аргументов для функции. Может быть, мы говорили о разных вещах ^_^ - person huangcd; 22.11.2010