如何对只读实例属性进行输入验证?

2023-12-09

发布了一个非常相似的问题here,但没有公认的答案,没有代码示例,而且我不太喜欢按照那里提供的唯一一个答案所建议的使用外部库的想法。

以下代码允许定义只读实例属性:

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y

但我也想验证用户输入。我想验证是否x and y有正确的类型。

最Pythonic/优雅的方法是什么?如果我提供设置器,属性就不再是只读的。

在构造函数中执行输入验证是唯一的方法吗?


这是一种优雅且Python式的方法,它使用工厂函数来创建属性:

class ReadOnlyError(Exception):
    """Attempt made to assign a new value to something that can't be changed."""


# Based on recipe in book "Python Cookbook 3rd Edition" - section 9.21 -
# titled "Avoiding Repetitive Property Methods".
def readonly_typed_property(name, expected_type):
    storage_name = '_' + name

    @property
    def prop(self):
        return getattr(self, storage_name)

    @prop.setter
    def prop(self, value):
        if hasattr(self, storage_name):
            raise ReadOnlyError('{!r} is read-only!'.format(name))
        if not isinstance(value, expected_type):
            raise TypeError('{!r} must be a {!r}'.format(name, expected_type.__name__))
        setattr(self, storage_name, value)

    return prop


class Point:
    x = readonly_typed_property('x', int)
    y = readonly_typed_property('y', int)

    def __init__(self, x, y):
        self.x = x
        self.y = y


if __name__ == '__main__':
    try:
        p1 = Point(1, 2)
    except Exception as e:
        print('ERROR: No exception should have been raised for case 1.')
        print(e)
    else:
        print('As expected, NO exception raised for case 1.')

    print()
    try:
        p2 = Point('1', 2)
    except TypeError as e:
        print(e)
        print(f'As expected, {type(e).__name__} exception raised for case 2.')
    else:
        print('ERROR: expected TypeError exception not raised for case 2')

    print()
    try:
        p1.x = 42
    except Exception as e:
        print(e)
        print(f'As expected, {type(e).__name__} exception raised for case 3.')
    else:
        print('ERROR: expected ReadOnlyError exception not raised for case 3')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对只读实例属性进行输入验证? 的相关文章

  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • 我如何有条件地要求使用 AngularJS 进行表单输入?

    假设我们正在使用 AngularJS 构建一个地址簿应用程序 人为的示例 我们有一个联系人表单 其中包含电子邮件和电话号码的输入 我们希望要求非此即彼 but not both 我们只想要email如果需要输入phone输入为空或无效 反之
  • d3:当鼠标悬停事件时,多系列折线图每行的工具提示

    我正在 Angular 2 应用程序中使用 d3 绘制图表 现在我有一个多系列折线图 因此我尝试在将鼠标悬停在其垂直位置时在每条线上添加工具提示 export class LineGraphDirective private host pr
  • 如何使用 HttpClient.PostAsync 发送大数据文件? [复制]

    这个问题在这里已经有答案了 我的功能如下 对于 25MB 左右的任何内容 它都可以很好地工作 但大于该值 它就会停止工作 当我说停止工作时 它不会抛出任何异常并且失败noserver函数底部的结果选项 我似乎找不到任何涉及任何其他缓冲区大小
  • 如何在 Spring Boot 中使用 Spring Web Services 动态 WSDL 生成?

    我跟着Spring Web 服务入门教程我已经整理了一个示例 Web 应用程序 可以在以下位置动态生成 W SDL ws holiday wsdl端点为请求提供服务 ws holidayService 到目前为止 一切都很好 现在我正在将该
  • 计算两条路径的交叉面积

    只有一个Raphael pathIntersection path1 path2 效用于Rapha l库 而这个方法只能获取交叉点这 2 条路径中 我需要的是交叉区域 如下图所示 该方法仅得到2分 用红色圆圈标记 我希望同时有另外 2 个点
  • 绝对路径和相对路径

    使用任何 Web 服务器或 Tomcat 时 绝对路径和相对路径有什么区别 绝对路径以 开头 指的是从当前站点 或虚拟主机 的根目录开始的位置 相对路径不以 开头 而是引用所引用文档的实际位置中的位置 示例 假设根是http foo com
  • 添加小数点时,ios 在字典上使用双引号

    我正在与 JSON 交互 对于 get 它工作正常 但是对于 post 我有一个错误 因为字典对象用双引号 引起来 对于网络服务 我收到双引号错误 问题是 如果我使用点来表示小数点 则会出现双引号 NSMutableDictionary d
  • 如何在 IPython 笔记本中隐藏 [重复]

    这个问题在这里已经有答案了 我正在绘制一个 NumPy 值数组 I 使用 IPython 笔记本 matplotlib使用绘图命令的内联模式plt plot I o 结果输出是
  • 使用生成的主键插入 Derby 表时,Eclipselink JPA 出现错误

    当使用生成的主键持久保存到表中时 EclipseLink 似乎错误地将空主键值传递给 Derby 德比返回错误尝试修改标识列在这种情况下 Derby 需要一条排除 id 值的 SQL 语句 我的问题是如何强制 EclipseLink 发送正
  • JavaScript 中处理大数 (BigNum) 的标准解决方案是什么?

    JavaScript 或浏览器中是否内置了 bignum 另一种方法是加载外部库 例如 但这似乎很慢并且可能会触发安全警告 我考虑过自己的基础http github com silentmatt javascript biginteger
  • 忽略基类 使用 Dokka 查看子类文档中的公共函数

    我使用 Dokka 为 View 子类生成了文档 效果很好 但文档包含基本 View 类的数百个公共函数 有没有办法只记录我的子类公共函数 我尝试将这些选项添加到 Gradle 任务中 但我不认为这就是它的用途 dokkaHtml dokk
  • 使用 EF Core Linq2Sql 进行聚合的聚合

    我有一个带有 EF Core 2 2 Code First DB 的 ASP NET Core 2 2 项目 我有以下实体 建筑物 基本上是一个带有一些其他重要数据的地址 Floor 包含楼层号 一栋建筑物可以有多层 一个楼层必须恰好有一个
  • 如何解释await/async同步上下文切换行为

    关于以下代码的行为 有几件事 但有一件主要的事情 我不明白 有人可以帮忙解释一下吗 它实际上是非常简单的代码 只是一个调用异步方法的常规方法 在异步方法中 我使用 using 块来尝试临时更改 SynchronizationContext
  • 从 JSP 返回 JSONP 而不是 JSON

    I found 这个问题从jsp将响应类型设置为json 但我需要将响应类型设置为jsonp以进行跨域访问 还会是这样吗 response setContentType application javascript 并将来自jsp的响应包装
  • 如何使用 R8 在堆栈跟踪中保留原始行号?

    我正在尝试找出如何使用 R8 保留原始行号 使用当前的AndroidStudio制作应用程序并使用R8对其进行混淆 甚至上传mapping txt将文件上传到 Google Play Console 后 用户的堆栈跟踪在某些情况下是无用的
  • T-SQL 中的编辑距离

    我对 T SQL 计算 Levenshtein 距离的算法感兴趣 我在 TSQL 中实现了标准 Levenshtein 编辑距离函数 并进行了多项优化 与我所知的其他版本相比 速度有所提高 如果两个字符串的开头有共同的字符 共享前缀 结尾有
  • 无法使最大宽度与 Bootstrap 下拉菜单一起使用

    我有一个 Bootstrap 下拉菜单 在某些情况下 菜单项可能非常大 所以我需要设置一个max width 另外 我不希望菜单项被剪切 所以我必须使用white space normal也 问题是我的max width被完全忽略 如果我设
  • File.Copy 与手动 FileStream.Write 复制文件

    我的问题是关于文件复制性能 我们有一个媒体管理系统 需要将文件系统上的大量文件移动到不同位置 包括同一网络上的 Windows 共享 FTP 站点 AmazonS3 等 当我们都在一个 Windows 网络上时 我们可以使用System I
  • Delphi 编译器指令反向求值参数

    这个使用 Math pas 中的 IFThen 函数的 delphi 两行代码给我留下了深刻的印象 但是 它首先评估 DB ReturnFieldI 这很不幸 因为我需要调用 DB first 来获取第一条记录 DB RunQuery se
  • 如何对只读实例属性进行输入验证?

    发布了一个非常相似的问题here 但没有公认的答案 没有代码示例 而且我不太喜欢按照那里提供的唯一一个答案所建议的使用外部库的想法 以下代码允许定义只读实例属性 class Point def init self x y self x x