Генерация кода Python класса из экземпляра Python этого класса - PullRequest
2 голосов
/ 07 октября 2011

В моем коде я генерирую новые классы Python во время выполнения. Для некоторых из них я хочу сгенерировать код Python, как если бы я написал эти классы в файле .py.

Допустим, я динамически создал класс A: type('A', (), {'bar':True} что эквивалентно коду:

class A(object): 
    bar=True

То, что я хочу, это сгенерировать этот эквивалентный код из моего динамического класса. Я пытаюсь реализовать функцию "generate_A_code"

kls_A = type('A', (), {'bar':True}
kls_A.generate_A_code()

Надеюсь, это немного поможет.

Спасибо

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Вы можете использовать compile(), exec() или eval() в зависимости от ваших точных потребностей.

0 голосов
/ 07 октября 2011

Возможно, вы могли бы использовать inspect.getsource :

import inspect

def generate_kls_A(num):
    class A(object):
        def __init__(self):
            self.init = num
    return A
kls_A=generate_kls_A(1)
print(inspect.getsource(kls_A))

выход:

class A(object):
    def __init__(self):
        self.init = num
0 голосов
/ 07 октября 2011

Генерирование кода Python из самого объекта класса практически невозможно. Вам нужно сохранить инструкции для генерации класса другим способом.


Наилучшим способом может быть наличие функции для создания класса, а также ее импорт и вызов в сгенерированном коде. Таким образом, сгенерированный код будет выглядеть так:

kwargs = {answer=42, name='foo'}

import class_maker
SomeClass1 = class_maker.make_class(**kwargs)

Другой вариант - сгенерировать код Python, который вы хотите напрямую, exec чтобы создать класс, а затем сохранить его вместе с классом.

code = '''class MyClass:
    pass
'''

the_locals = {}
exec(code, globals(), the_locals)
MyClass = the_locals['MyClass']
MyClass._code = code

Как всегда с exec, будьте очень осторожны при его использовании. Он может запустить любой код Python. Подумайте, если есть какой-то способ сделать то, что вам нужно, по-другому. Люди будут кричать на вас за использование exec. (Но даже стандартная библиотека Python использует ее для динамических классов , иногда .)

...