除非我弄错了,创建Python函数的方式如下:
def my_func(param1, param2):
# stuff
然而,您实际上没有给出这些参数的类型。此外,如果我没记错的话,Python是一种强类型语言,因此看起来Python不应该允许您传递与函数创建者预期的不同类型的参数。但是,Python如何知道函数的用户是否传递了正确的类型?如果类型不正确,程序会崩溃吗?您必须指定类型吗?
除非我弄错了,创建Python函数的方式如下:
def my_func(param1, param2):
# stuff
然而,您实际上没有给出这些参数的类型。此外,如果我没记错的话,Python是一种强类型语言,因此看起来Python不应该允许您传递与函数创建者预期的不同类型的参数。但是,Python如何知道函数的用户是否传递了正确的类型?如果类型不正确,程序会崩溃吗?您必须指定类型吗?
foo
将添加一切可以__add__
的内容;)而不必过多担心其类型。因此,为了避免失败,您应该只提供支持加法的那些内容。def foo(a,b):
return a + b
class Bar(object):
pass
class Zoo(object):
def __add__(self, other):
return 'zoom'
if __name__=='__main__':
print foo(1, 2)
print foo('james', 'bond')
print foo(Zoo(), Zoo())
print foo(Bar(), Bar()) # Should fail
def foo(bar: str) -> List[float]
表示 bar 应该是一个字符串,并且该函数返回一个浮点数列表。如果在方法调用之前(或返回类型之前)类型不匹配,则会导致类型检查错误。我认为这比关于方法调用中缺少字段或方法的错误更有帮助。我建议阅读官方 Python 文档Typing - Support for type hints。我没有在其他答案中看到这个提到,所以我会补充一下。
正如其他人所说,Python不会对函数或方法参数强制执行类型。假定你知道你在做什么,如果你真的需要知道传入的某些东西的类型,你会检查它并决定自己该怎么做。
其中一个主要工具是isinstance()函数。
例如,如果我编写一个期望获取原始二进制文本数据而不是常规的utf-8编码字符串的方法,我可以在输入时检查参数的类型,并根据情况进行适应或引发异常来拒绝。
def process(data):
if not isinstance(data, bytes) and not isinstance(data, bytearray):
raise TypeError('Invalid type: data must be a byte string or bytearray, not %r' % type(data))
# Do more stuff
*
)。from typing import *
然后你就可以开始使用了:
List, Tuple, Set, Map - for list, tuple, set and map respectively.
Iterable - useful for generators.
Any - when it could be anything.
Union - when it could be anything within a specified set of types, as opposed to Any.
Optional - when it might be None. Shorthand for Union[T, None].
TypeVar - used with generics.
Callable - used primarily for functions, but could be used for other callables.
int
, list
, dict
等类型名称...from somewhere import *
不是一个好主意,原因和在C++中使用using namespace std;
一样。
这样做会使代码混杂着你并不一定使用的方法和类型,而且可能会在后续的代码中意外调用到你不想调用的内容(尤其是如果你经常滥用这种方式)。捕捉这些错误通常非常困难。最好的做法是只导入你需要的内容(例如from somewhere import a, b, c
),或者用一个简短的别名导入库并使用该别名来调用你需要的内容(例如import some.nested.module.very_long_name as vln
,然后使用vln.do_something()
)。 - undefined
List[float]
,L要大写,也已经修复了。再试一次,看看它是否正常工作。 - spriteList
只在 Python 3.9 之前版本中需要,现已被弃用,建议使用list
。 - chepner