提供在Python3.6中键入内容的工具。

typing-tools的Python项目详细描述


键入工具

这是一个python 3.6+的库,它添加了一些类似dict的类,支持javascript对象中的属性。

此模块提供2个类-dictstructassignmentsupportable。 继承你的类,所有的专长都将启用。 下面的示例了解更多详细信息。

示例用法

dictstruct

让我们声明一个circle和一个point类:

import json
from typing import List, Dict, Tuple
from typing_tools import DictStruct, AssignmentSupportable

class Point(DictStruct):
    x: int
    y: int

class Circle(DictStruct):
    r: int
    c: Point

让我们创建一个圆对象。 它既是字典又是命名空间,因此允许.attribute['attribute']调用。

_point_dict = { 'x': 5, 'y': 18 }
_circle_dict = { 'c': _point_dict, 'r': 6 }
p = Point(_point_dict)
o = Circle(_circle_dict)

请注意,这也可以工作: o = Circle(r=4, c=Point(x=2, y=15))

现在,打印出来:

print(f"Circle is: {o}")
print(f"Circle Radius is: {o.r}")
print(f"Circle Center is: {o.c}")
print(f"Circle Center X is: {o.c.x}")
print(f"Circle Center Y is: {o.c.x}")
print(json.dumps(o))

这将打印:

Circle is: {'r': 4, 'c': {'x': 2, 'y': 15}}
Circle Radius is: 4
Circle Center is: {'x': 2, 'y': 15}
Circle Center X is: 2
Circle Center Y is: 2
{"r": 4, "c": {"x": 2, "y": 15}}

它还支持默认值和方法:

class PointWithDefaults(DictStruct):
    x: int = 0
    y: int = 0
    
    def print_me(self):
        print(f"PointWithDefaults is: {self}")
        print(f"PointWithDefaults X is: {self.x} and {self['x']} and {self.get('x')}")
        print(f"PointWithDefaults Y is: {self.y} and {self['y']} and {self.get('y')}")

...

p = PointWithDefaults(y=6)
p.print_me()

p.x = 8
p.y = 4
p.print_me()
print()

注意,字典中不包括方法。 输出:

PointWithDefaults is: {'y': 6, 'x': 0}
PointWithDefaults X is: 0 and 0 and 0
PointWithDefaults Y is: 6 and 6 and 6
PointWithDefaults is: {'y': 4, 'x': 8}
PointWithDefaults X is: 8 and 8 and 8
PointWithDefaults Y is: 4 and 4 and 4
可支持分配

好吧,我明白了。但是我怎么能在我的自定义类中使用它呢? 只需为其父母添加一个可支持的分配!

class Figure(AssignmentSupportable):
    points: List[Point]

class NamedFigure(AssignmentSupportable):
    points_dict: Dict[str, Point]
f = Figure()
f.points = [{ 'x': 5, 'y': 18 }, Point(x=2, y=15), dict(x=1, y=22)]
print(f"Figure is: {f}")
print(f"Figure Points are: {f.points}")
for i, _p in enumerate(f.points):
    print(f"Figure Point #{i+1} is: {_p}")
    print(f"Figure Point #{i+1} X is: {_p.x}")
    print(f"Figure Point #{i+1} Y is: {_p.y}")
print()

f2 = NamedFigure()
f2.points_dict = { 'A': { 'x': 5, 'y': 18 }, 'PointB': Point(x=2, y=15), 'p.C': dict(x=1, y=22) }
print(f"NamedFigure is: {f2}")
print(f"NamedFigure Points are: {f2.points_dict}")
for _name, _p in f2.points_dict.items():
    print(f"NamedFigure Point '{_name}' is: {_p}")
    print(f"NamedFigure Point '{_name}' X is: {_p.x}")
    print(f"NamedFigure Point '{_name}' Y is: {_p.y}")
print()

输出:

Figure is: <__main__.Figure object at 0x7fe838cf09e8>
Figure Points are: [{'x': 5, 'y': 18}, {'x': 2, 'y': 15}, {'x': 1, 'y': 22}]
Figure Point #1 is: {'x': 5, 'y': 18}
Figure Point #1 X is: 5
Figure Point #1 Y is: 18
Figure Point #2 is: {'x': 2, 'y': 15}
Figure Point #2 X is: 2
Figure Point #2 Y is: 15
Figure Point #3 is: {'x': 1, 'y': 22}
Figure Point #3 X is: 1
Figure Point #3 Y is: 22

NamedFigure is: <__main__.NamedFigure object at 0x7fe838cf0a58>
NamedFigure Points are: {'A': {'x': 5, 'y': 18}, 'PointB': {'x': 2, 'y': 15}, 'p.C': {'x': 1, 'y': 22}}
NamedFigure Point 'A' is: {'x': 5, 'y': 18}
NamedFigure Point 'A' X is: 5
NamedFigure Point 'A' Y is: 18
NamedFigure Point 'PointB' is: {'x': 2, 'y': 15}
NamedFigure Point 'PointB' X is: 2
NamedFigure Point 'PointB' Y is: 15
NamedFigure Point 'p.C' is: {'x': 1, 'y': 22}
NamedFigure Point 'p.C' X is: 1
NamedFigure Point 'p.C' Y is: 22

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java构造函数SimpleCommandBus()不可见   Java字符串和返回   java不能在类中使用上下文?   使用Java为SOAP定制DataHandler   java“访问被拒绝”在编译servlet时   java嵌入Jetty,在给定时间后终止请求   java如何使用预先指定的URL限制AWS S3 bucket中对象的上传大小?   java理解Azure文件存储:未知hostException   java将对象作为参数传递是否会产生与将其存储在字段中相同级别的耦合?   https告诉java客户端代码接受自签名证书   Java中的简单*权威DNS服务器*   Java解压缩字节数组错误数据检查   当我用SpringDoc和接口描述API规范时,java Spring控制器验证似乎不起作用   在Java中使用PHash(OpenCV)   Kotlin中的java简单继承示例   java Infinispan:ISPN004016:服务器不再位于群集中(127.0.0.1:11222),正在从池中删除   2行滑动菜单安卓本机JAVA   使用日期选择器时Android Studio中的java 4错误   java在<之间删除内容!和/>