首页 > 编程问答 >如何注释可以转换为布尔值的参数?

如何注释可以转换为布尔值的参数?

时间:2024-07-28 04:47:15浏览次数:11  
标签:python python-typing

我开始进入 python 3.6 中的类型提示(又名注释),并且我无法理解此功能的一些动态方面。

我编写了以下代码段,我想添加注释和即使在查看了有关类型提示的文档后,也不知道如何实现。

这是函数:

def validate_expression(expression: ?):
    try:
        assert expression
    except AssertionError as e:
        ...

expression 需要是断言起作用的任何内容(假设 bool(expression) 有效的任何表达式)。

我应该写什么而不是问号?

更新:

我知道大多数 python 表达式都可以转换为布尔值,但是我编写此代码的上下文是合理期望表达式的上下文 成为可断言的。

我的例子中的相关示例是 pandas.DataFrame 运行 bool(pandas.DataFrame()) 会引发错误,我有充分的理由预计有人可能会尝试将数据帧传递给验证函数。

更新2: 以下 Cepner 的评论和答案,我现在明白:

  1. 在绝大多数情况下,任何 python 表达式都会有效地转换为布尔值,这要么被 typing.Any 覆盖,要么根本不添加注释。
  2. 在边缘我感兴趣的情况是 bool(pandas.DataFrame()) # --> ValueError ,注释不会有帮助,因为这是一个运行时错误。
  3. 如果存在与静态类型提示相关的另一个边缘情况,我不知道它。|| |鉴于相关示例的稀有/不存在,没有开箱即用的类型通常只描述转换为布尔值的能力的质量(类似于
  4. ),并且就我而言不值得费尽心思来解决这种边缘情况(尽管听到相关示例和弯曲解决方案会很有趣!) typing.Iterable ), and as far as I'm concerned it is not worth bending over backwards to address such an edge case (although it would be interesting to hear of relevant example and a bend-y solution!)

在 Python 中,几乎任何表达式都可以转换为布尔值。因此,没有一种特定的类型提示可以完全捕获你想要的内容。你最终会使用 typing.Any ,这实际上与根本不使用类型提示相同。

你的选择

  1. 保持原样,使用 typing.Any 或不使用任何类型提示:

```python from typing import Any

def validate_expression(expression: Any): # 或 # def validate_expression(expression): try: assert expression except AssertionError as e: ... ```

这是最直接的方法,表明该函数接受任何类型的表达式。

  1. 记录预期行为:

虽然你不能在类型提示中强制执行此操作,但可以在文档字符串中清楚地记录预期行为:

```python def validate_expression(expression: Any): """验证表达式是否为真。

Args: expression: 要评估的表达式。应支持转换为布尔值。

Raises: AssertionError: 如果表达式不为真。 """ try: assert expression except AssertionError as e: ... ```

类型提示的局限性

重要的是要记住,Python 中的类型提示主要用于静态分析工具(如类型检查器),而不是在运行时强制执行。当涉及到 bool(expression) 的行为时,它在运行时确定,类型提示无法完全捕获它可能引发的所有潜在错误。

针对你提到的 pandas.DataFrame 的具体案例:

你不能使用类型提示来防止有人传递 pandas.DataFrame validate_expression 函数中。这是因为在尝试将 pandas.DataFrame 转换为布尔值时发生的错误是一个运行时错误,类型提示无法阻止运行时错误。

在这种情况下,记录预期行为并让调用者负责传递合适的参数至关重要。如果需要,你可以在函数中添加显式运行时检查以处理特定情况,例如 pandas.DataFrame

标签:python,python-typing
From: 57712347

相关文章

  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......
  • Python学习笔记45:游戏篇之外星人入侵(六)
    前言飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。子弹模块子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对......
  • 三种语言实现二分(C++/Python/Java)
    题目给定一个按照升序排列的长度为......
  • python+flask计算机毕业设计农场营销管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代农业的快速发展,农场管理日益复杂,尤其是营销环节,传统的销售模式已难以满足市场快速变化的需求。农场主面临着如何高效管理农资采购......
  • python+flask计算机毕业设计社区独居老人健康管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会老龄化的加速,独居老人群体日益庞大,成为社会关注的焦点。这一群体在享受独立生活的同时,也面临着健康监测不及时、生活照料缺失、医......