【问题标题】:Python Marshmallow and PyCharm Type HintingPython Marshmallow 和 PyCharm 类型提示
【发布时间】:2019-12-18 05:28:06
【问题描述】:

我对使用 python marshmallow 库进行数据序列化很感兴趣,但我遇到了一个问题,即当使用 Schema.load 方法构造类时,PyCharm 无法建议类属性,如在示例中显示。

考虑以下可能人为设计的示例:

from marshmallow import Schema, post_load, fields

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class UserSchema(Schema):
    name = fields.String(required=True)
    age = fields.Integer(required=True)

    @post_load
    def make_user(self, data, **kwargs):
        return User(**data)

class UserHolder:
    def __init__(self):
        self.user = UserSchema().load({"name": "foo", "age": 42})

class UserHolderConsumer:
    def __init__(self):
        self.user_holder = UserHolder()

    def get_user(self):
        print("Name: {}; Age: {}".format(self.user_holder.user.name, self.user_holder.user.age))

if __name__ == "__main__":
    UserHolderConsumer().get_user()

代码有效——意味着数据在那里——但 PyCharm 无法建议类属性。我在这方面对 PyCharm 的要求太多了,还是我遗漏了什么?

【问题讨论】:

  • 如果你打破它self.user = UserSchema(); self.user.load(...)我想那么它会工作......或者如果它的python3你可以注释类型self.user:UserSchema = ...
  • @JoranBeasley 它是 python3,这两个建议都有效。谢谢!

标签: python serialization pycharm marshmallow


【解决方案1】:

只是为了后代,根据上面的答案,以下允许它工作。

self.user: UserSchema = UserSchema().load({"name": "foo", "age": 42})

【讨论】:

  • 该表达式引发类型提示警告,因为 load() 返回类型是 Dict[str, Any]
猜你喜欢
  • 2015-10-17
  • 2013-12-26
  • 2019-05-27
  • 2020-08-22
  • 2021-03-11
  • 2015-11-23
  • 2017-11-30
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多