переменные сервалона python объединяются в dict? - PullRequest
4 голосов
/ 20 октября 2010

All

А класс:

class foo():
    def __init__(self):
        self.avar1 = 0
        self.bvar2 = 1
        self.cvar3 = 3
    def debug_info(self):
        print "avar1:" avar1
        print "bvar2:" bvar2
        print "cvar3:" cvar3

мой вопрос, слишком сложно написать debug_info (), если у меня много self.vars затем я хочу перенести их в файл для печати за один раз для отладки и мониторинга, однако, возможно, я не хочу потерять формат

foo.avar1 = 0

для доступа к переменным внутри класса, потому что его легко читать, а также легко использовать и модифицировать. У вас есть идея лучше, чем посещать класс. dict для вывода debug_info? или кто-то знает лучший способ сделать этот класс более простым?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 20 октября 2010
def debug_info ( self ):
    for ( key, value ) in self.__dict__.items():
        print( key, '=', value )
2 голосов
/ 20 октября 2010

У каждого объекта Python уже есть такой словарь, это self.__dict__. Он печатается достаточно хорошо, как и другие данные Python, но вы можете контролировать формат, используя Data pretty printer в стандартной библиотеке Python циклически просматривая элементы в словаре и печатая их, как вы хотите, как показано ниже:

class foo():
    def __init__(self):
        self.avar1 = 0
        self.bvar2 = 1
        self.cvar3 = 3
    def debug_info(self):
        for k in self.__dict__:
            print k + ':' + str(self.__dict__[k])


>>> foo().debug_info()
bvar2:1
cvar3:3
avar1:0
1 голос
/ 20 октября 2010

Другие ответили на ваш вопрос о печати.Если в вашем методе __init__ нужно установить много переменных, вы также можете использовать __dict__, чтобы сделать это немного короче.Если у вас много переменных, это, по крайней мере, избавит вас от необходимости постоянно вводить self.Я думаю, что стандартный способ более читабелен в большинстве случаев, но ваш пробег может варьироваться.

def __init__(self):
    vars = dict(avar1=0, bvar2=1, cvar3=3)
    self.__dict__.update(vars)
1 голос
/ 20 октября 2010

Хотя использование __dict__ будет работать в большинстве случаев, оно не всегда будет работать - особенно для объектов, которые имеют переменную __slots__.

Вместо этого попробуйте следующее:

vars = [var for var in dir(obj) if not callable(getattr(obj, var)) and not var.startswith('__')]
1 голос
/ 20 октября 2010

Модули, классы и экземпляры имеют __dict__, поэтому вы можете ссылаться на него в экземпляре, для которого вы хотите отобразить отладку:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...