Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';def some_方法(param:int)语法的要点是什么?_Python_Parameters - Fatal编程技术网

Python 什么';def some_方法(param:int)语法的要点是什么?

Python 什么';def some_方法(param:int)语法的要点是什么?,python,parameters,Python,Parameters,特别是“:int”部分 我假设它在调用函数时以某种方式检查了参数的类型,并可能在发生冲突时引发异常。但以下程序运行时不会出现问题: def some_method(param:str): print("blah") some_method(1) def some_method(param:int): print("blah") some_method("asdfaslkj") 在这两种情况下,都会打印“废话”-无例外 我不确定该功能的名称,所以我不确定谷歌应该怎么做 编辑

特别是“:int”部分

我假设它在调用函数时以某种方式检查了参数的类型,并可能在发生冲突时引发异常。但以下程序运行时不会出现问题:

def some_method(param:str):
    print("blah")

some_method(1)

def some_method(param:int):
    print("blah")

some_method("asdfaslkj")
在这两种情况下,都会打印“废话”-无例外

我不确定该功能的名称,所以我不确定谷歌应该怎么做

编辑:好的,就是这样。我可以看出它在利用元数据的框架中是多么有用。不是我想象的那样。谢谢你的回复


后续问题-如果我真的只能处理int输入,那么将我的函数定义为def some_method(param:int)是个好主意还是个坏主意?即使如pep 3107所解释的,它只是元数据,也没有我最初设想的强制执行?至少这些方法的消费者会清楚地看到我的意图。它是文档的替代品。你认为这是好/坏/浪费时间吗?诚然,良好的参数命名(与我设计的示例不同)通常可以清楚地说明要传递的类型。

它没有太多用途,只是用于实验(例如,如果需要,可以从python中读取它们)。它们被称为“函数注释”,并被描述

我编写了一个名为()的库,该库构建在它的基础上,用于执行类型检查(以及更多操作——例如,您可以更轻松地从JSON映射到python对象),但它不是很流行。。。(我还应该补充一点,pytyp的类型检查部分一点也不高效——它可以用于跟踪bug,但您不希望在整个程序中使用它)


[更新:我不建议一般使用函数注释(即与文档一样没有特别用途),因为(1)它们最终可能会以您意想不到的方式使用,(2)在python中,确切的类型通常不那么重要(更确切地说,并不总是清楚如何以有用的方式指定某事物的类型-对象可能非常复杂,并且通常只有“部分”被任何一个函数使用,多个类以不同的方式实现这些部分…。这是-参见“更多信息”的结果链接以获取有关如何使用python的抽象基类来解决此问题的相关讨论…]

在python中没有经验,但我假设关键是注释/声明方法所需的参数类型。是否在运行时严格强制执行所需的类型与此无关

例如,考虑:

intToHexString(param:int)

尽管该语言在技术上允许您调用
intToHexString(“Hello”)
,这样做在语义上没有意义。将
:int
作为方法声明的一部分有助于加强这一点。

它基本上只是用于文档编制。当一些人检查方法签名时,他们会看到
param
被标记为
int
,这将告诉他们方法的作者期望他们通过一个
int

因为Python程序员使用duck类型,这并不意味着您必须传递一个
int
,但它告诉您代码需要“类似int”的东西。因此您可能必须传递一些基本上是“数值”的东西本质上,它支持算术运算。根据方法的不同,它可能必须可用作索引,也可能不可用

但是,因为它是语法而不仅仅是注释,所以注释对任何想要内省它的代码都是可见的。这就打开了编写
typecheck
decorator的可能性,该decorator可以对任意函数强制执行严格的类型检查;这允许您将类型检查逻辑放在一个位置,并对每个方法进行declare它希望以最少的语法对哪些参数进行严格的类型检查(通过附加一个类型注释),这种方式对于浏览方法定义以查找接口的客户机程序员是可见的


或者你可以用这些注释做其他事情。目前还没有标准化的含义。也许如果有人提出了一个使用它们的杀手级功能并获得了广泛的采用,那么它终有一天会成为Python语言的一部分,但我怀疑无论你想怎样使用它们的灵活性将非常有用,永远无法做到这一点。

F函数注释是由它们组成的

它们可用于记录:

def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second'):
     ...
它们可用于先决条件检查:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        msg = 'Var: {0}\tValue: {1}\tTest: {2.__name__}'.format(var, value, test)
        assert test(value), msg


def is_int(x):
    return isinstance(x, int)

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    return _between

def f(x: between(3, 10), y: is_int):
    validate(f, locals())
    print(x, y)


>>> f(0, 31.1)
Traceback (most recent call last):
   ... 
AssertionError: Var: y  Value: 31.1 Test: is_int
def验证(函数、局部变量):
对于var,在func.\uuuuu注释\uuuuu.items()中进行测试:
值=局部变量[var]
msg='Var:{0}\t值:{1}\t测试:{2.\u__名称\u_}'。格式(Var,值,测试)
断言测试(值),msg
def为_int(x):
返回isinstance(x,int)
def介于(低、高)之间:
def_介于(x)之间:
返回lo>f(0,31.1)
回溯(最近一次呼叫最后一次):
... 
断言错误:Var:y值:31.1测试:is_int
另请参阅以了解实现类型检查的方法。

您还可以使用“->returnValue”表示法来指示函数可能返回的类型

def mul(a:int, b:int) -> None:
    print(a*b)

基于这个想法,我想知道你是否可以不指定int而指定numeric_value,因为它只是元数据。你必须在某个地方定义numeric_值,还有一个缺点(至少在PyCharm中)数字_值不会像int那样以明亮的颜色突出。但是,可能有一些设置使这成为可能。