【发布时间】:2021-01-12 08:24:36
【问题描述】:
我正在使用服务器端的 python 中的 socketio 和客户端的 JS 创建一个小应用程序。 对于我的一个事件,客户端发出一个由用户在浏览器中创建的字符对象,以供服务器持久保存。
在服务器端,在持久化之前需要进行一些验证,因此我创建了 Character 类,以便将所有字符验证等保存在一个区域中。
Character 有这样的构造函数:
class Character():
def __init__(self, stats=None, strength=0, stamina=0, armor=0, agility=0, charisma=0, health=0, lowAttack=0, highAttack=0, attack=0, ability_points=16, characterName=""):
if stats is None:
stats = ['strength', 'stamina', 'armor', 'agility', 'charisma']
self.stats = stats
self.strength = strength
self.stamina = stamina
self.armor = armor
self.agility = agility
self.charisma = charisma
self.health = health
self.lowAttack = lowAttack
self.highAttack = highAttack
self.attack = attack
self.ability_points = ability_points
self.characterName = ""
这是服务器首次以字典形式接收数据时的样子:
{'stats': ['strength', 'stamina', 'armor', 'agility', 'charisma'], 'strength': 1, 'stamina': 0, 'armor': 0, 'agility': 0, 'charisma': 0, 'health': 0, 'lowAttack': 0, 'highAttack': 0, 'attack': 0, 'ability_points': 15, 'characterName': 'Buck County'}
在这个例子中可能很难注意到,但是这个 dicts 的值与 Character 类的构造函数中的默认值不同,例如:
'strength': 1
'characterName': 'Buck County'
'ability_points': 15
上面最重要的是 'characterName': 'Buck County'
理想情况下,我接下来想做的是把它变成一个类的实例,以便执行我创建的所有验证,然后使用instance.__dict__ 来持久化它。
现在,根据我所读到的关于拆包的内容,这就是我正在做的事情:
newCharacter = Character(**character)
print(newCharacter.__dict__)
这是从上面打印的内容:
{'stats': ['strength', 'stamina', 'armor', 'agility', 'charisma'], 'strength': 1, 'stamina': 0, 'armor': 0, 'agility': 0, 'charisma': 0, 'health': 0, 'lowAttack': 0, 'highAttack': 0, 'attack': 0, 'ability_points': 15, 'characterName': ''}
所以,下面我将把从客户端发送到服务器的 dict 与 dict 解包后属于该类的 dict 打印出来进入。
{'stats': ['strength', 'stamina', 'armor', 'agility', 'charisma'], 'strength': 1, 'stamina': 0, 'armor': 0, 'agility': 0, 'charisma': 0, 'health': 0, 'lowAttack': 0, 'highAttack': 0, 'attack': 0, 'ability_points': 15, 'characterName': 'Buck County'}
{'stats': ['strength', 'stamina', 'armor', 'agility', 'charisma'], 'strength': 1, 'stamina': 0, 'armor': 0, 'agility': 0, 'charisma': 0, 'health': 0, 'lowAttack': 0, 'highAttack': 0, 'attack': 0, 'ability_points': 15, 'characterName': ''}
您可以在比较中非常清楚地看到,唯一没有正确解包的值是名称。相反,它会导致默认值“”
我是 Python 新手,具有 Java / JS 背景。任何建议将不胜感激。谢谢
【问题讨论】:
-
您的意思是:
self.characterName = characterName? -
哇,是的,我确实做到了。
标签: python class dictionary socket.io iterable-unpacking