【问题标题】:Python Function with "Pointers"带有“指针”的 Python 函数
【发布时间】:2011-03-22 00:52:22
【问题描述】:

好的,我最近开始用 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) 的解决方案。

【问题讨论】:

  • 您可能需要显示 less 代码。使用最少的代码 sn-p 提炼您的问题,在没有太多细节的情况下显示您所追求的内容可能会有所帮助。
  • 好的,我要问另一个问题,因为我在这个问题上走错了方向。我还需要一个更好的标题。对于那个很抱歉。如果您想关注它的进展,我将从这里链接到它。编辑:这是新问题:stackoverflow.com/questions/5385821/…
  • 标记“不是一个真正的问题”,因为提问者提出了一个不同的、更集中(因此更容易回答)的问题,旨在取代。

标签: python xml function pointers lxml


【解决方案1】:

您是否尝试过/查看过getattrsetattr 函数?

例如,假设这些“变量”是对象属性:

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

【讨论】:

  • 好吧,这是一个想法。我要设置的变量确实是一个对象属性(对象的变量)。该标签是一个包含字符串的对象化 lxml 节点。基本上,我正在检查是否存在 xml 节点,然后将变量设置为它包含的任何内容。如果它不存在,那么我将其设置为预定义的字符串。
  • 针对该用例进行了编辑。您基本上必须在两个单独的对象上使用getattrsetattr:这些“变量”所属的对象和对象化节点。
  • 是的,我可能会创建一个关于 lxml 和 objectify 的新问题,因为我认为我不想走“指针”路线。
  • @Biosci3c Python 中没有包含某些值的变量。只有点引用的对象。您应该了解更多有关 Python 的对象模型、数据模型和执行模型的知识。
  • 什么指针?这里没有涉及“指针”……(不是在 C 级别)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多