1作为函数声明中的参数类型 - python

如果在我的示例中需要在Python数组中指定参数类型,则需要编写如下内容:

def my_function(param: list):
    pass

在Swift中,您可以这样指定参数类型:

func myFunction(param: [Any]) {
//
}

有一天,我犯了Swift风格的错误,并写道:

def my_function_2(param: []):
    pass

现在我注意到了,尝试一些更奇怪的事情:

def my_function_3(param: 1):
    pass

所有这些函数都是有效的,可以在Python 3.6中调用。预期参数类型为1的函数...为什么会发生,为什么我看不到任何警告,并且必须将哪种类型的变量传递给函数2和3才能满足我错误请求的参数类型?

参考方案

注释对Python的编译器和解释器没有意义。1只要您键入的是语法上有效的表达式,Python都会对其进行求值,将其值存储为函数注释的一部分,并留在那里供您执行所需的操作。 (通常不算什么)。

实际上,您可以看到此存储没有问题:

>>> print(my_function_3.__annotations__)
{'param': 1}

注释的要点是使用静态类型检查器,如PEP 484中所述(以及随附的PEP 483和PEP 482用于背景)。

静态类型检查在Python中是可选的,通常使用专用工具(例如mypy)或集成到IDE中的工具(例如PyCharm)来完成。

如果您对您的代码运行这样的检查器,它将发出投诉。例如:

$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation

此错误意味着无法确定1应该是哪种类型。2

最后一件事:

我必须将哪种类型的变量传递给函数2和3才能满足我错误地请求的参数类型

没有任何类型可以满足要求。 Python的运行时类型规则比其(可选)静态类型规则更灵活,但它们不那么灵活。3

1.但是,它们确实对stdlib中的至少一件事the dataclass decorator有意义。

2. Mypy从此处继续,但是没有更多错误,即使您滥用主体中的参数或不正确地调用函数也是如此。据我所知,它会跳过检查正文,并将该函数视为已接受任何参数并返回了Any。这是很合理的-这样一来,您只会得到一个错误,而不是数百个可能毫无意义的无用错误。

3.您甚至无法测试它-isinstance(obj, 1)将引发异常because 1 is not an instance of type 。但是,如果可以的话,只有在通过将obj(或1的子类,没有子类)作为元类调用创建1时,才可能返回true,或者如果obj.__class__设置为1(或子类),则返回true。 ,这是不可能的,或者int具有接受obj的实例或子类钩子,而否。但是-至少在CPython和PyPy中-甚至还没有达到目标。当然,您总是可以在Python之下,在C API下,并直接修改ob_type下的struct的obj字段以指向1对象,但是,如果您这样做,则尝试使用obj进行的操作都只会出现段错误。

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:如何停止多线程的numpy? - python

我知道这似乎是一个荒谬的问题,但是我必须在与部门中其他人共享的计算服务器上定期运行作业,当我开始10个作业时,我真的希望它只占用10个核心而不是更多;我不在乎每次运行一个内核所需的时间是否更长:我只是不想让它侵犯其他人的领土,这将需要我放弃工作等等。我只想拥有10个核心,仅此而已。更具体地说,我在基于Python 2.7.3和numpy 1.6.1的Redh…