Функция Python с «указателями» - PullRequest
0 голосов
/ 22 марта 2011

Хорошо, я недавно начал программировать на Python, и мне действительно это нравится.

Однако я столкнулся с небольшой проблемой.

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

Вот фрагмент кода:

       try:
            if elem.virtual.tag:
                virt = True
                temp_asset.set_virtual(True)
        except AttributeError:
            temp_asset.set_virtual(False)
        if virt: #if virtual, get only faction, value, and range for presence
            try:
                fac = elem.presence.faction #an xml tag (objectified)
            except AttributeError:
                fac = "faction tag not found"
                temp_asset.misload = True
            try:
                val = elem.presence.value
            except AttributeError:
                val = "value tag not found"
                temp_asset.misload = True
            try:
                rang = elem.presence.range
            except AttributeError:
                rang = "range tag not found"
                temp_asset.misload = True
            #Set presence values
            temp_asset.set_presence(fac, val, rang)

Функции устанавливают значения, но я хочу иметь возможность выполнять проверку ошибок примерно так:

def checkval(self, variable_to_set, tag_to_use)
    try:
         variable_to_set = tag_to_use
    except AttributeError:
         variable_to_set = "tag not found"
         temp_asset.misload = True

Это выполнимо? Дайте мне знать, если мне нужно показать больше кода.

Редактировать: мне не нужны указатели как таковые, просто все, что работает таким образом и экономит печатать.

Редактировать 2: В качестве альтернативы мне нужно решить, как проверить, существует ли объективированный узел XML (lxml).

1 Ответ

1 голос
/ 22 марта 2011

Вы пробовали / изучали функции getattr и setattr?

Например, если предположить, что эти «переменные» являются атрибутами объекта:

def checkval(self, attr, presence, tagstr):
    tag = getattr(presence, tagstr, None)           # tag = presence."tagstr" or None
    setattr(self, attr, tag or 'tag not found')     # ?? = presence."tagstr" or 'tag not found'     
    if tag is None:
        self.temp_asset.misload = True   

Вы называете это как,

your_object.checkval('fac', elem.presence, 'faction')

Кроме того, вы можете предварительно определить эти переменные и установить их значения по умолчанию, прежде чем пытаться искать теги. Например:

class YourObject(object):
    _attrmap = {
        'fac': 'faction',
        'val': 'value',
        'rang': 'range',
    }

    def __init__(self):
        # set default values
        for attr, tagstr in self._attrmap.items():
            setattr(self, attr, '%s tag not found' % tagstr)

    def checkval(self, attr, presence):
        for attr, tagstr in self._attrmap.items():
            tag = getattr(presence, tagstr, None)
            if tag is not None:
                setattr(self, attr, tag)
            else:
                self.temp_asset.misload = True
...