Python dict 解包运算符不在构造函数中解包字符串
Python dict unpacking operator not unpacking string in constructor
我正在服务器端 python 中使用 socketio 并在客户端使用 JS 创建一个小应用程序。
对于我的一个事件,客户端发出一个由用户在浏览器中创建并由服务器持久化的角色对象。
在服务器端,在持久化之前需要进行一些验证,因此 我创建了字符 class 以便将所有字符验证等保存在一个区域中。
角色有一个像这样的构造函数:
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'}
在这个例子中可能很难注意到,但是这个字典值与字符 class 的构造函数中的默认值不同,例如:
'strength': 1
'characterName': 'Buck County'
'ability_points': 15
上面提到的最重要的是 'characterName': 'Buck County'
理想情况下,我接下来要做的是将它变成 class 的实例,以便执行我创建的所有验证,然后只使用 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 class 一旦 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 背景。任何建议将不胜感激。谢谢
我可能误解了这个问题,但在您的 __init__
中,您似乎定义了 self.characterName = ""
,而不是 self.characterName = characterName
我正在服务器端 python 中使用 socketio 并在客户端使用 JS 创建一个小应用程序。 对于我的一个事件,客户端发出一个由用户在浏览器中创建并由服务器持久化的角色对象。
在服务器端,在持久化之前需要进行一些验证,因此 我创建了字符 class 以便将所有字符验证等保存在一个区域中。
角色有一个像这样的构造函数:
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'}
在这个例子中可能很难注意到,但是这个字典值与字符 class 的构造函数中的默认值不同,例如:
'strength': 1
'characterName': 'Buck County'
'ability_points': 15
上面提到的最重要的是 'characterName': 'Buck County'
理想情况下,我接下来要做的是将它变成 class 的实例,以便执行我创建的所有验证,然后只使用 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 class 一旦 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 背景。任何建议将不胜感激。谢谢
我可能误解了这个问题,但在您的 __init__
中,您似乎定义了 self.characterName = ""
,而不是 self.characterName = characterName