2010-11-22 2 views
1

Я использую pypy для перевода некоторого скрипта python на язык C. Скажите, что у меня есть класс питона так:Как я могу аннотировать класс в pypy?

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

Благодарим вас за чтение и ответ.

+0

Синтаксис декоратора. –

+0

Что такое функция 'target()'? – martineau

+0

В какую строку применяется «перевод: ERROR»? Я не вижу никаких вызовов 'func()' в коде. Какая ошибка связана с «аннотированием» класса? – martineau

ответ

1

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

+0

Как staticmethod, так и classmethod в порядке для меня, и classmethod может быть лучше – huangcd

+0

Если вы просто не заботитесь о 'self' и ничего не должны делать с классом, используйте' staticmethod'. –

+0

Извините, может быть, я не прояснился. Я заботился о себе. это должен быть конкретный класс. Мне нужно взаимодействовать с членом класса – huangcd

4

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

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

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

или даже:

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

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

+0

Спасибо, фиджал. Я знаю, что когда я вызываю функцию из точки входа, эта функция будет аннотирована. Однако, когда я вызываю эту функцию только один раз, аргументы становятся константами в генерации кода. Произнесите функцию 'def f (a): return a + 1'. Если я назову его в точке входа, например 'f (1)', он будет генерировать '2' вместо функции' long pypy_g_f (long a) {return a + 1} ', поэтому я должен позвонить ей дважды или больше, чтобы все исправить. Это довольно сложно. Поэтому я пытался сгенерировать функцию напрямую, используя 'translateshell.py', и на этот вопрос приходит мой вопрос – huangcd

+0

translatorshell в любом случае устарел. Если вы хотите экспортировать некоторый интерфейс, там есть переводчик/goal/sharedpypy.py и translator/c/dlltool.py, которые являются началом того, что вы хотите, если хотите внедрить программу RPython. Например, они дадут разумные имена для функций. Я использовал это для встраивания pypy в webkit. – fijal

Смежные вопросы