适用于多种情况的 Python 设计模式

2023-12-25

编写具有多种条件的验证函数的推荐结构是什么?请参阅这两个示例。第一个看起来很难看,第二个不太常见,也许是因为assert通常用于排除意外行为。有更好的选择吗?

def validate(val):
  if cond1(val):
    return False
  if cond2(val):
    return False
  if cond3(val)
    return False
  return True

Or

def validate(val):
  try:
    assert cond1(val)
    assert cond2(val)
    assert cond3(val)
    return True
  except AssertionError:
    return False

编写该函数的一种紧凑方法是使用any和一个生成器表达式:

def validate(val):
    conditions = (cond1, cond2, cond3)
    return not any(cond(val) for cond in conditions)

The any and all功能短路,所以一旦有确定的结果就会停止测试,即any一旦达到 True-ish 值就停止,all一旦达到 False 值就会停止,因此这种形式的测试非常有效。

我还应该提到的是much将这样的生成器表达式传递给更有效all / any比列表理解。因为all / any一旦获得有效结果就停止测试,如果您从生成器提供它们,则生成器也会停止,因此在上面的代码中,如果cond(val)评估为 True-ish 值,不会测试进一步的条件。但如果你通过了all / any列表理解,例如any([cond(val) for cond in conditions])整个列表必须之前构建all / any甚至可以开始测试。


你还没有向我们展示你的内部结构cond功能,但你确实提到assert对于你的问题,我认为以下评论是合适的。

正如我在评论中提到的,assert不应该用于验证数据,它用于验证程序逻辑。 (此外,可以通过 -O 命令行选项禁用断言处理)。用于具有无效值的数据的正确异常是ValueError,对于类型错误的对象,请使用TypeError。但请记住,异常是为了处理异常情况而设计的。

如果您预计会出现大量格式错误的数据,那么使用通常会更有效if基于逻辑而不是异常。如果实际上没有引发异常,Python 异常处理速度相当快,事实上它比同等情况更快if基于代码。然而,如果异常发生的次数超过 5-10%,那么try...except基于的代码将明显慢于if基于等效。

当然,有时使用异常是唯一明智的选择,即使情况并非那么特殊。一个典型的示例是,当您将数字字符串集合转换为实际数字对象时,表示整数的字符串将转换为整数对象,其他数字字符串将转换为浮点数,而其他字符串将保留为字符串。在 Python 中执行此操作的标准方法涉及使用异常。例如 https://stackoverflow.com/a/5609191/4014959:

def convert(s):
    ''' Convert s to int or float, if possible '''
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return s

data = ['42', 'spam', '2.99792458E8']
out = [convert(u) for u in data]
print(out)
print([type(u) for u in out])

output

[42, 'spam', 299792458.0]
[<class 'int'>, <class 'str'>, <class 'float'>]

Using “三思而后行” https://docs.python.org/3/glossary.html#term-lbyl这里的逻辑是possible在这里,但这使代码变得更加复杂,因为您需要处理可能的减号和科学记数法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于多种情况的 Python 设计模式 的相关文章

随机推荐

  • 通过 iPhone 的 IP 地址进行地理定位

    我喜欢追踪用户 location 通过使用设备的 IP 地址 我已经寻找过一些 API 服务 例如 自由地理网 api petabyet com ip api com 但我不知道如何使用此服务来获取用户设备的位置 实际上我已经寻找了一些 S
  • HTML CSS自动调整高度

    我试图通过使用 CSS LESS 可视化来显示出港和入境航班 问题是 当出境航班比入境航班有更多的机场变更时 线路将保持在第一个航班的水平 我希望根据最长的路线动态调整线路高度 您能帮我弄清楚如何达到所需的结果吗 UPDATE 准备好了Pl
  • 如何创建可重定位的应用程序

    希望可以有人帮帮我 我有一些用 python 编写的东西 这使用了很多库 因此 我使用 virtualenv 创建了一个虚拟环境 并复制了该环境中需要的每个文件 然后我使用 Platypus 创建了一个 app 当然 该应用程序无法正常工作
  • 网络浏览器搜索是如何实现的?

    我想在桌面应用程序中实现java搜索和突出显示multiple中的短语html文件 就像在网络浏览器中完成的那样 所以html 标签 内 lt and gt 被忽略但有些标签像 b 没有被忽视 搜索示例时each table在文本中 eac
  • 引用 unique_ptr 的向量

    我有一个收藏unique ptrs 在这里 我想取出其中一些并将它们返回给调用者 调用者只需要读取内容 所以我想使用常量引用 但我不知道如何做到这一点unique ptrs 这是我用来使用原始指针执行此操作的一些代码 class entry
  • 从用户处获取字符输入时出现 IndexOutOfBoundsException

    在第15行ch s1 charAt 0 为什么 ch 没有得到 s1 的第 0 个字 即运算符 我尝试过不使用 try catch 方法 但错误与异常有关 现在没有例外 没有错误 但程序不要求操作员并在输入后直接 第一个和第二个值 它显示异
  • PostgreSQL 将列从 inet 转换为文本

    我想更改列的类型inet to text 所以 我执行 ALTER TABLE table ALTER COLUMN col TYPE text 但后来我发现所有值都添加了掩码 例如 192 168 100 141 gt 192 168 1
  • GCM BroadcastReceiver setResultCode 使用

    我正在使用 Android 开发人员提供的 GCM 示例 但无法理解其用途 setResultCode Activity Result OK 哪个组件接收此消息 谁在调用它并接收它 这是例子 public class GcmBroadcas
  • XAML Horizo​​ntalAlignment 属性没有执行我想要的操作

    xaml 代码 在网格内
  • 为遮罩层添加边框

    我正在尝试制作自定义形状UIButton使用遮罩层 我成功了 extension UIButton func mask withImage image UIImage frame CGRect let maskingLayer CAShap
  • Microsoft.Owin.StaticFiles 在控制台主机中工作,但我在文件请求的 IIS 中收到 404

    我在 Owin 管道中设置了 Microsoft Owin FileServer v2 1 0 并且使用 EnableDirectoryBrowsing true 设置 FileServerOptions 非常适合在我的控制台主机和 iis
  • 两个类互相引用

    假设有两个类 它们相互需要 容器 and item 班上容器创建类的实例item 类的每个实例item持有类的一个实例容器并且只需要调用该方法按项目调用的方法班级的容器 Class 容器需要查看类的所有字段item 问题是前向声明 我想在其
  • 为什么定义数组之外的第一个元素默认为零?

    我正在准备 C 入门课程的期末考试 我们的教授给了我们这个问题来练习 解释为什么代码会产生以下输出 120 200 16 0 using namespace std int main int x 120 200 16 for int i 0
  • 如何使 Bootstrap 工具提示在 SVG 上居中?

    我想将工具提示向右移动几个像素 因此箭头位于光标所在单元格的中心 当前 它位于 0 0 即左上角 这是我的代码 rect cell tooltip title hola placement top and an image 理想情况下 我想
  • 如何在异常发生之前检测到导致异常的情况?

    我没有运气这个问题 https stackoverflow com questions 553331 detecting unusable pooled sqlconnections所以我制作了这个尽可能简单的测试用例来演示这个问题 在下面
  • WPF 将 My.Settings 集合绑定到组合框项目

    我对 WPF 非常陌生 并且仍在尝试了解 XAML 中的绑定 我想用 my settings 中字符串集合的值填充组合框 我可以用这样的代码来做到这一点 Me ComboBox1 ItemsSource My Settings MyColl
  • 水晶报表将 DateTime 转换为字符串 为该函数提供了太多参数

    我在水晶报告中有一个简单的公式 如下所示 iif isnull employ createdDate ToText employ createdDate dd MMM yyyy The employ createdDate 格式如下 02
  • luis.ai 与 api.ai 与 wit.ai 之间的比较?

    有谁知道三者之间的具体区别和功能 或者作为开发人员是否有更多功能 更灵活地使用 wit ai https wit ai vs 对话流 https api ai vs luis ai https www luis ai wit ai vs a
  • 在 cartopy 轴之间绘制线

    我绘制了两组重叠的轴 一组是另一组的缩放版本 我想在缩放轴的角和它在较大轴上表示的矩形的角之间绘制线 然而 我画的线稍微偏离了位置 我试图将其浓缩为一个简单的示例 import cartopy crs as ccrs import matp
  • 适用于多种情况的 Python 设计模式

    编写具有多种条件的验证函数的推荐结构是什么 请参阅这两个示例 第一个看起来很难看 第二个不太常见 也许是因为assert通常用于排除意外行为 有更好的选择吗 def validate val if cond1 val return Fals