在Python中,如何让自定义类型来描述更具体的类型提示?
In Python, how to make a custom type to describe a more specific type hints?
我是 运行 一个使用 openpyxl 的脚本,我有一些函数 copy_value
显示如下:
from openpyxl.workbook.workbook import Workbook
def copy_value(source: Workbook, target: Workbook, cell: str) -> None:
do something...
现在我担心的是参数 cell
的类型提示只是一个通用的 str
。我想要一个自定义的和更具体的类型,比如 Cell
(也是 str
),这样用户就会知道这个参数不仅会采用任何其他字符串,例如 'abc' 或 '123worksheet',但必须是有效的单元格,例如 'D12' 或 'AA345'.
或者如何正确地做到这一点?
如果你想通过类型提示进行验证,你可以做类似
的事情
class Cell(str):
def __new__(cls, cell_identifier: str):
if not cell_identifier.startswith('abc'): # Add your string validation logic here
raise ValueError('Cell identifier is not valid!')
return str.__new__(cls, cell_identifier)
那么你的函数就像
def copy_value(source: Workbook, target: Workbook, cell: Cell) -> None:
do something...
注意类型提示旨在检查变量的类型,而不是它们的运行时值。
类型提示不能确保传递给您的函数的参数来自提示类型,因此不能保证它们遵循您想要的字符串模式。
从原始类型继承不是很常见,通常也不需要。
如果验证很重要,则由您来验证数据。在调用函数和传递参数时,或者在你的函数中更好,比如
def copy_value(source: Workbook, target: Workbook, cell: str) -> None:
if cell.startswith('abc'): # Your validation logic here
raise ValueError('Cell identifier is not valid!')
do something...
我是 运行 一个使用 openpyxl 的脚本,我有一些函数 copy_value
显示如下:
from openpyxl.workbook.workbook import Workbook
def copy_value(source: Workbook, target: Workbook, cell: str) -> None:
do something...
现在我担心的是参数 cell
的类型提示只是一个通用的 str
。我想要一个自定义的和更具体的类型,比如 Cell
(也是 str
),这样用户就会知道这个参数不仅会采用任何其他字符串,例如 'abc' 或 '123worksheet',但必须是有效的单元格,例如 'D12' 或 'AA345'.
或者如何正确地做到这一点?
如果你想通过类型提示进行验证,你可以做类似
的事情class Cell(str):
def __new__(cls, cell_identifier: str):
if not cell_identifier.startswith('abc'): # Add your string validation logic here
raise ValueError('Cell identifier is not valid!')
return str.__new__(cls, cell_identifier)
那么你的函数就像
def copy_value(source: Workbook, target: Workbook, cell: Cell) -> None:
do something...
注意类型提示旨在检查变量的类型,而不是它们的运行时值。 类型提示不能确保传递给您的函数的参数来自提示类型,因此不能保证它们遵循您想要的字符串模式。 从原始类型继承不是很常见,通常也不需要。
如果验证很重要,则由您来验证数据。在调用函数和传递参数时,或者在你的函数中更好,比如
def copy_value(source: Workbook, target: Workbook, cell: str) -> None:
if cell.startswith('abc'): # Your validation logic here
raise ValueError('Cell identifier is not valid!')
do something...