Python Type Hint中Optional[str]=None和str=None的区别
Python Type Hint中Optional[str]=None和str=None的区别
1 问题来源
在读到Fluent Python, 2ed Edition, P260时产生了一些疑问:
在Python中使用type hint时,以下两个声明有什么区别呢?
def show_count(count: int, singular: str, plural: Optional[str] = None) -> str: # 声明1
def show_count(count: int, singular: str, plural: str = None) -> str: # 声明2
2 个人见解
# -*- coding: utf-8 -*-
# @Time : 2022/12/19 14:53
# @File : messages.py
# @Description : None
# @Author : Yann
from typing import Optional
def show_count(count: int, singular: str, plural: Optional[str] = None) -> str:
# Quiz:
# plural: Optional[str] = None 和 plural: str = None的区别?
#
# Optional[str]是在type hint的层面说明这个参数是一个可选参数,但它并不能让该参数变成一个可选参数。
# 例如:
# def show_count(count: int, singular: str, plural: Optional[str]) -> str:
# 在这个声明中,type hint说明plural是一个可选参数,但它实际上并不是,不满足Python对于可选参数的语法要求。
# Remember: at run time, type hints are ignored! (Fluent Python, 2ed Edition, P260)
#
# str = None实在函数语法层面说明这个参数是一个可选参数。此时无论type hint怎么写,都不影响这个参数是一个可选参数的事实。
# 例如:
# def show_count(count: int, singular: str, plural: Optional[str] = None) -> str: # 声明1
# 在声明1中,= None在语法层面说明plural是一个可选参数,而且在type hint层面也说明plural是一个可选的str参数。
# def show_count(count: int, singular: str, plural: str = None) -> str: # 声明2
# 而在声明2中,= None在语法层面说明plural是一个可选参数,但在type hint层面只说明plural应该是一个str。
# 显然,此时type hint是不够准确的因为当plural缺省使用默认参数时,它是一个None,显然不是一个str。
#
# 相比于声明2,声明1的type hint显然更加准确。但这并不影响函数执行的结果。
# Remember: at run time, type hints are ignored! (Fluent Python, 2ed Edition, P260)
#
if count == 1:
return f'1 {singular}'
count_str = str(count) if count else 'no'
if not plural:
plural = singular + 's'
return f'{count_str} {plural}'
Python Type Hint中Optional[str]=None和str=None的区别的更多相关文章
- Python type hints 之 Optional,Union
1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...
- Python Type Hint类型注解
原文地址:https://realpython.com/python-type-checking/ 在本指南中,你将了解Python类型检查.传统上,Python解释器以灵活但隐式的方式处理类型.Py ...
- Python工程文件中的名词解释---Module与Package的区别
当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. M ...
- python time包中的time.time()和time.clock()的区别
在统计python代码 执行速度时要使用到time包,在查找相关函数时有time.time()和time.clock()两个函数可供选择.而两者是有区别的: cpu 的运行机制:cpu是多任务的,例如 ...
- python 读写文件中 w与wt ; r与rt 的区别
w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符.类Unix平 ...
- Python type类具体的三大分类:metaclasses,classes,instance
Python type类视角中的对象体系需要我们不断的学习,其中我们使用的时候需要注意.下面我们就看看如何才能更好的运用Python type类.下面的文章希望大家有所收获. 在单纯的Python t ...
- python开发_python中str.format()
格式化一个字符串的输出结果,我们在很多地方都可以看到,如:c/c++中都有见过 下面看看python中的字符串格式函数str.format(): 1 #使用str.format()函数 2 3 #使用 ...
- python TypeError: unsupported operand type(s) for +: 'geoprocessing value object' and 'str'
TypeError: unsupported operand type(s) for +: 'geoprocessing value object' and 'str' if self.params[ ...
- 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 3、Python Basics with numpy (optional)
Python Basics with numpy (optional)Welcome to your first (Optional) programming exercise of the deep ...
- python 中的input()和raw_input()功能与使用区别
在python中raw_input()和input()都是提示并获取用户输入的函数,然后将用户的输入数据存入变量中.但二者在处理返回数据类型上有差别. input()函数是raw_intput()和e ...
随机推荐
- List集合转换成数组
我现在有个需求:将File集合转换成MultipartFile数组结构 然后我就开始在网上开启了List转换到数组之旅. 首先来看一个例子 ArrayList<String> list=n ...
- ABAP 物料主数据 屏幕增强按钮
首先看效果,目标是在物料主数据中 基础数据页面新增一个按钮来满足跳转需求,这里以跳转百度为例 页面效果如下: 创建定制程序 事务代码 SPRO,路径:后勤-常规 -> 物料主数据 -> 配 ...
- java乱码处理
package com.zhouhe.util; import java.io.UnsupportedEncodingException; /** * 自定义工具类 * @Author zhouhe ...
- vue remark重置 提交
html: <el-table-column prop="remark" label=""> <templat ...
- OSS管理文件(Node.js)
let OSS = require('ali-oss'); let config = { region: 'oss-cn-hangzhou', //你的Region 注意 这个只要 空间名 不要 ht ...
- Python面向对象编程——__init()__方法
隐式基类object 每个python类都隐式继承object 全文代码实例实现:枚举扑克牌的花色和牌面值 一._init()__方法:对象初始化 显示而非隐式:__init()__应显示展示初始化变 ...
- php中self和$this还有parent的区别
1.self代表类,$this代表对象 2.能用$this的地方一定使用self,能用self的地方不一定能用$this 3.parent只能调用静态属性,并且可以调用父类中公有和受保护的方法 静态的 ...
- POJ I Think I Need a Houseboat
I Think I Need a Houseboat 思路:距离问题,一道水题 代码: #include <iostream> #include <cmath> using n ...
- 对synchronized的理解和Spring为什么是单例的
只有真正理解了Java中对象是什么,才能理解这个关键字是什么意思 字面解释 Java Guide中如此解释: synchronized 关键字解决的是多个线程之间访问资源的同步性,synchroniz ...
- openEuler22.09初始化脚本
#!/bin/bash s=`nmcli d | grep "已断开" | awk '{print $1}'` echo /etc/sysconfig/network-script ...