【问题标题】:Python dict unpacking operator not unpacking string in constructorPython dict解包运算符不在构造函数中解包字符串
【发布时间】: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


【解决方案1】:

我可能误解了这个问题,但看起来在您的 __init__ 中,您定义了 self.characterName = "",而不是 self.characterName = characterName

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2022-11-24
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多