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 ...
随机推荐
- RabbitMQ学习第七章:消息确认机制之事务机制
RabbitMQ消息确认机制之事务机制. RabbitMQ中,我们可以通过持久化数据 解决RabbitMQ服务器异常 的数据丢失问题. 问题:生产者将消息发送出去,消息到底有没有到达RabbitMQ服 ...
- Es6中模块引入的相关内容
注意:AMD规范和commonJS规范 1.相同点:都是为了模块化. 2.不同点:AMD规范则是非同步加载模块,允许指定回调函数.CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行 ...
- vue 鼠标拖拽
<template> <div class="home"> <div id="box" v-drag></div> ...
- PR-不同分辨率视频如何合并
1.文件-新建-序列,可以使用预设,也可以自行设置基础分辨率. 2.将分辨率不同的视频,在"效果控件"-"缩放"当中,设置合适的缩放比例即可.
- c++内存分配函数
c语言中: 动态分配内存: malloc()函数; 释放内存: free()函数; c++中: 上述函数仍然可以使用; 动态分配内存: new关键字; 释放内存: delete关键字; int *p ...
- ZIP文件操作工具类
2 3 import lombok.extern.slf4j.Slf4j; 4 import org.apache.commons.io.FilenameUtils; 5 6 import java. ...
- 基础篇之DOS命令
对于编程的小朋友来说,在DOS中输入一些命令也是常有的事情. 今天就来学习一些常见的命令.[该篇是在B站学习Siki学院的课程时做的笔记] DOS命令目录操作 常用DOS命令(输入命令后按下回车) d ...
- 第八章:diff
1.git diff命令的格式 1]可以使用git diff命令的来源,(任意树对象.工作目录.索引) 2]git diff命令进行树比较时,可以通过(提交名.分支名.标签名) 3]git d ...
- GitLab + Rainbond 打造Devops流程
GitLab + Rainbond 打造Devops流程 流程 预设项目有两个分支,dev和master dev分支对应dev环境 master分支对应test环境和prod环境 开发在dev中编写代 ...
- Git系列 -> 如何获取远程库某个文件
有时候远程库存放很多文件夹,我们可能只需要下载或获取某个文件中的内容,可以采用以下: 首先点击clone 按钮,然后复制clone URL , 如果想要下载其中的某个文件夹的内容,需要在后面加入指定文 ...