是否可以有一个键值对并将键映射到一个变量并将该值分配给该变量?

时间:2020-04-24 21:54:09

标签: python python-3.x

假设我有一个包含许多标签和值的缓冲区:

=name-tag='John'=address-tag='1st Street'=city-tag='Big City'

扫描此缓冲区将产生许多键值对:

=name-tag=  John
=addr-tag=  1st Street
=city-tag=  Big City

现在我要映射:

  • =name-tag=到变量name
  • =addr-tag=到变量addr
  • =city-tag=到变量city

我找到了一种方法来做,但是我感觉它太复杂了。 因此,如果您有任何将字符串轻松映射到变量并为其分配值的想法,那将非常有帮助。

class ValueContainer:
    def __init__(self, value=None):
        self.value = value

def set_val(key, value):
    d[key].value = value

name = ValueContainer()
addr = ValueContainer()
city = ValueContainer()

# mapping of the tags to the objects
d = {'name_tag': name, 'addr_tag': addr, 'city_tag': city}

# Parsing a buffer gives me several "tags" and "values"
# Assign the value to the corresponding variable (object)
set_val('name_tag', 'John')
set_val('addr_tag', '1st Street')
set_val('city_tag', 'Big City')

print(name.value)  # John
print(addr.value)  # 1st Street
print(city.value)  # Big City

2 个答案:

答案 0 :(得分:1)

我可能为此使用正则表达式,并且我不会设置本地人,而只会设置字典:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="list-group-item">
  <strong>item 1</strong> description
  <a class="btn btn-default btn-xs pull-right listing-sub-remove" data-id="5e98a2dc5e0aye57597b181b">
            Unsubscribe
        </a>
</div>
<div class="list-group-item">
  <strong>item 2</strong> description
  <a class="btn btn-default btn-xs pull-right listing-sub-remove" data-id="5e58ac128edaey3f2935d94b">
            Unsubscribe
        </a>
</div>
.

如果要将这些值加载到对象中:

import re

x = "=name-tag='John'=address-tag='1st Street'=city-tag='Big City'"
pattern = re.compile(r"=([a-z]+)-tag='(.*?)'")
matches = dict(pattern.findall(x))

答案 1 :(得分:-2)

使用 setattr 魔术方法应该适合您。如果这些值映射到除'_tag'以外的相同名称,我将其命名为self.__setattr__(key[0:key.index('_')], value)

class Container:

    TAGS = {'name_tag': 'name', 'addr_tag': 'addr', 'city_tag': 'city'}

    def __init__(self):
        pass

    def MapValue(self, key, value):
        self.__setattr__(Container.TAGS[key], value)