具有类型强制的不可变数据记录

data-records的Python项目详细描述


数据记录

PyPI versionpipeline statuscoverage reportPyPIDocumentation StatusDownloads

在某些函数语言中有一个记录的概念。它们是不可变数据的产品数据类型 具有类型化属性。

目标

以下是本项目开发过程中的设计目标和“北极星”:

  • 易用性
    • 简单的界面
    • 在大多数情况下,这是显而易见的吗
  • 不变性
    • 遵循不变性模式,如替换和模式匹配
  • 安全
    • 尽可能包含类型强制
    • 确保记录具有生成的类型
    • 执行错误时抛出警告

动机

强制键入

我喜欢@dataclass,当它被添加到python中时,我欣喜若狂。但是某些事情,如:

>>>fromdataclassesimportdataclass,field>>>@dataclass...classFoo:...bar:str...baz:int>>>Foo(1,2)Foo(bar=1,baz=2)

不是我从其他类型语言中得到的。在静态类型语言中,这将抛出 错误,因为bar应该是字符串。在具有类型强制的语言中,我希望bar"1"。违约 这里的数据类的行为两者都不是,如果我在某个地方使用这个数据类,那么它应该是一个字符串 它会因运行时异常而失败;确切地说,应该帮助防止什么类型的异常。

>>>fromdata_recordsimportdatarecord>>>@datarecord...classFoo:...bar:str...baz:int>>>Foo(1,2)Foo(bar='1',baz=2)>>>Foo("a","b")Traceback(mostrecentcalllast):...ValueError:invalidliteralforint()withbase10:'b'

无关的现场处理

数据类的另一个问题是,当试图传入的字典的键数超过所需的键数时 创建数据类:

>>>fromdataclassesimportdataclass>>>@dataclass...classFoo:...bar:str...baz:int>>>Foo(**{'bar':'test','baz':1,'other':'nothing'})Traceback(mostrecentcalllast):...TypeError:__init__()gotanunexpectedkeywordargument'other'

这使得很难从较大的数据库调用或接收到的数据中提取数据记录。

>>>fromdata_recordsimportdatarecord>>>@datarecord...classFoo:...bar:str...baz:int>>>Foo(**{'bar':'test','baz':1,'other':'test'})Foo(bar='test',baz=1)>>>Foo.from_dict({'bar':'test','baz':1,'other':'test'})Foo(bar='test',baz=1)

不可变处理

数据记录是不可变的(很像冻结的数据类),对这些记录的处理是内置的:

>>>fromdata_recordsimportdatarecord>>>@datarecord...classFoo:...bar:str...baz:int...lat:float...long:float>>>example=Foo('test',2,65.1,-127.5)>>>example2=example.replace(bar='testing')>>>exampleFoo(bar='test',baz=2,lat=65.1,long=-127.5)>>>example2Foo(bar='testing',baz=2,lat=65.1,long=-127.5)>>>latitude,longitude=example.extract('lat','long')>>>latitude65.1

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

推荐PyPI第三方库


热门话题
java如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java