【发布时间】:2020-10-16 12:00:47
【问题描述】:
我正在尝试创建一个可以从类型定义生成 clickhouse (sql-ish) 架构的数据类。
clickhouse 例如支持:
- Int8
- Int16
- Uint8
- Uint16
在 python 中,这些类型不存在(afaik)。只是int。我希望我仍然可以创建一个类型结构,让我表达它并自动生成我想要的模式,并可能对类型运行验证。我也希望我的类型提示(我使用 PyCharm,不确定 mypy)在传递 int 类型的值时不会抱怨
这是我目前的想法:
@dataclass
class ClickhouseType:
@classmethod
def schema_type(cls):
return cls.__name__
@classmethod
def validate(cls, value):
# just included as an example, not important as part of this discussion :)
pass
@dataclass
class Int8(int, ClickhouseType):
@classmethod
def validate(cls, value):
# just included as an example, not important as part of this discussion :)
assert -128 <= value <= 127
@dataclass
class MySchema:
some_number: Int8
x = MySchema(some_number=4) # type hint complaints that I pass an int when an Int8 is required
有没有办法让 python/我的类型提示明白我希望 Int8 可以与 int 互换?
【问题讨论】:
-
问题在于
Int8是int,但int不是Int8。MySchema是否需要专门使用Int8?如果是这样,您将遇到一个问题,即并非每个int都可以是Int8,而且 afaik 无法静态检查。 -
另外,您可以尝试使用
typing'sNewType来消除Int8等的一些样板,但这对您当前的问题没有帮助。 -
非常感谢。我将研究 NewType。我对并非每个 int 都是 Int8 感到满意,因为我不太担心这一点,而不是人们(我)传递一个字符串。我尝试使用覆盖
__instancecheck__的元类,但类型提示没有选择它。不过可能是类型提示问题:) -
@Carcigenicate:不,
SupportsIndex更合适。SupportsInt包括float之类的内容。 -
@user2357112supportsMonica 你是对的。已删除。
标签: python types type-hinting python-dataclasses