是否有与Typescript';Python中的扩展点是什么?

是否有与Typescript';Python中的扩展点是什么?,python,typescript,python-typing,Python,Typescript,Python Typing,我开始在Python中使用类型提示。我有以下功能: def func(arg: Optional[str]): # ... # make sure arg is a string and not None do_something(arg) # do_something expects a string 只有当arg确实是一个字符串而不是一个字符串时,才能调用dou\u something,但是mypy无法自己解决它(这不是mypy的问题,它无法理解所有内容)。因此m

我开始在Python中使用类型提示。我有以下功能:

def func(arg: Optional[str]):
    # ...
    # make sure arg is a string and not None
    do_something(arg)  # do_something expects a string
只有当arg确实是一个字符串而不是一个字符串时,才能调用
dou\u something
,但是mypy无法自己解决它(这不是mypy的问题,它无法理解所有内容)。因此mypy将调用标记为
do\u something
,因为arg可能是None


在Typescript中,类似的情况可以用
arg-感叹号告诉静态分析器,
arg
不是未定义的。Python中有类似的东西吗?

Python中没有空安全性

您所能做的就是:

if arg is not None:
    do_something(arg)
或者,如果要引发异常:

if arg is None:
    raise Exception("arg == none")

do_something(arg) # arg will not be None
此外,在普通python中,类型提示没有任何意义,因为这只是一种可视的提示,没有任何检查。例如,以下代码可以正常工作:

def x(y: int):
    return y

x("hello")

python中没有空安全性

您所能做的就是:

if arg is not None:
    do_something(arg)
或者,如果要引发异常:

if arg is None:
    raise Exception("arg == none")

do_something(arg) # arg will not be None
此外,在普通python中,类型提示没有任何意义,因为这只是一种可视的提示,没有任何检查。例如,以下代码可以正常工作:

def x(y: int):
    return y

x("hello")

如果您的逻辑包含以下内容,Mypy不应标记任何内容:

if arg is None:
    return None
如果不可能,您还可以在警告之前添加断言:

assert x is not None

如果您的逻辑包含以下内容,Mypy不应标记任何内容:

if arg is None:
    return None
如果不可能,您还可以在警告之前添加断言:

assert x is not None

TypeScript和使用mypy的Python之间有几个基本的区别。它更接近于ECMAScript with的工作方式,而不是TypeScript的工作方式。或者,现代IDE如何在文档注释中使用类型提示

首先,TypeScript有一个类型系统和类型规则。Python没有类型系统或类型规则。Python只有类型提示的语法。然而,Python本身并不使用这些类型提示。这将留给第三方工具完成。这有一些优点也有一些缺点。最大的优点是,您可以选择对特定应用程序域最有用的工具。最大的缺点是,当你写下一个类型提示时,你实际上不知道它的意思…因为它没有任何意义。含义由外部第三方工具指定

换句话说:Python类型提示没有定义的语义

第二个区别是TypeScript有一种单独的类型语言。Python的类型语言只是Python。这意味着类型提示必须是语法有效的Python表达式。事实上,类型提示是在运行时评估的,因此它们不仅必须是语法有效的Python,还必须是语义有效的Python;它们需要是无错误或异常的可执行文件,即使您从未在运行时实际使用它们,并且仅将它们用于静态类型检查(例如使用mypy)。(这就是
键入
模块的主要原因:提供函数和对象,允许您将要编写的语法(例如泛型)转换为有效的运行时表达式。)

换句话说:Python类型提示没有单独的语法,它们只是Python表达式

因此,这告诉我们的第一件事是,无论您提出什么潜在的解决方案,它都必须是语法和语义上有效的Python<代码>arg在语法上不是有效的Python。因此,与TypeScript语法完全等效是不可能的

因此,我们必须检查是否可以找到具有不同语法的语义等价物。我们可以找到的可能地点有:

看看这三个人,我们发现我们什么也没找到。这并不能证明这样的事情不存在(证据的缺乏不是证据的缺乏),但这是一个很好的迹象

Mypy仅支持等效于:

如果arg为None:
通过
其他:
#mypy知道这里的'arg'是'str'
如果arg不是None:
#mypy知道这里的'arg'是'str'
如果不是arg:
通过
其他:
#mypy知道这里的'arg'是'str'
如果arg:
#mypy知道这里的'arg'是'str'
如果您不能提供这样的类型保护,或者您完全100%知道此时
arg
不能
None
,在任何情况下,您都不能提供类型断言:

assert arg不是None
#mypy知道这里的'arg'是'str'
类型断言还将让mypy知道在该点之后,
arg
不能是
None
。这在mypy文档中有明确的记录


从语义上讲,这可能是与TypeScript
最接近的东西类型运算符。事实上,
操作符实际上只是一个断言:“嘿,类型检查器,相信我,我知道一些你不知道的东西。”这与Python断言所说的完全相同。

TypeScript和Python与mypy之间有一些基本的区别。它更接近于ECMAScript with的工作方式,而不是TypeScript的工作方式。或者,现代IDE如何在文档注释中使用类型提示

首先,TypeScript有一个类型系统和类型规则。Python没有类型系统或类型规则。Python只有类型提示的语法。然而,Python本身并不使用这些类型提示。这将留给第三方工具完成。这有一些优点也有一些缺点。最大的优点是,您可以选择对特定应用程序域最有用的工具。最大的缺点是,当你写下一个类型提示时,你实际上不知道它的意思…因为它没有任何意义。含义由外部第三方工具指定

换句话说:Python类型提示没有定义的语义

第二个区别是TypeScript有一种单独的类型语言。Python的类型语言只是Python。这意味着类型提示必须是语法上有效的Pyt