我知道,类型检查函数参数在Python中通常是不受欢迎的,但我认为我已经想出了一个有意义的情况。在我的项目中,我有一个抽象基类Coord,它有一个子类Vector,它具有更多功能,如旋转、改变大小等。数字的列表和元组isinstance(x,Coord)也将返回True。我还有许多接受这些Coord类型作为参数的函数和方法。我已经设置了装饰器来检查这些方法的参数。这是一个简化的版本:classaccepts(object):def__init__(self,*types):self.types=typesdef__call__(self,func):defwrapper(*args):
需要一种方法来检查一个对象是否是某个特定模块中任何类的实例。我知道我可以通过从该模块显式导入每个类并使用元组检查来做到这一点:frommy_moduleimportClassOne,ClassTwo>>>isinstance(my_obj,(ClassOne,ClassTwo))True但实际上,我从中导入的模块中有大量的类,显式导入它们似乎是不必要的冗长,使用它们来构建一个巨大的元组,并对其进行类型检查。我已经尝试了一些方法来避免这种情况:importmy_module#Testmy_objagainstthemoduleitself>>>isinstance(my_obj,my_m
需要一种方法来检查一个对象是否是某个特定模块中任何类的实例。我知道我可以通过从该模块显式导入每个类并使用元组检查来做到这一点:frommy_moduleimportClassOne,ClassTwo>>>isinstance(my_obj,(ClassOne,ClassTwo))True但实际上,我从中导入的模块中有大量的类,显式导入它们似乎是不必要的冗长,使用它们来构建一个巨大的元组,并对其进行类型检查。我已经尝试了一些方法来避免这种情况:importmy_module#Testmy_objagainstthemoduleitself>>>isinstance(my_obj,my_m
一个语义问题,真的。直到最近,如果我必须对结构进行任何类型检查,我会使用type(obj)islist等。人。但是,自从加入SO以来,我注意到每个人(我的意思是EVERYONE)都使用isinstance(obj,list)代替。似乎它们是同义词,timeit揭示了它们之间几乎相同的速度。defa():returntype(list())islistdefb():returnisinstance(list(),list)fromtimeitimporttimeittimeit(a)#0.5239454597495582timeit(b)#0.5021292075273176事实上,即使
一个语义问题,真的。直到最近,如果我必须对结构进行任何类型检查,我会使用type(obj)islist等。人。但是,自从加入SO以来,我注意到每个人(我的意思是EVERYONE)都使用isinstance(obj,list)代替。似乎它们是同义词,timeit揭示了它们之间几乎相同的速度。defa():returntype(list())islistdefb():returnisinstance(list(),list)fromtimeitimporttimeittimeit(a)#0.5239454597495582timeit(b)#0.5021292075273176事实上,即使
我正在使用Python,每当我必须验证函数输入时,我都会假设输入有效,然后发现错误。在我的例子中,我有一个通用的Vector()类,我用它来做一些不同的事情,其中之一就是加法。它既可用作Color()类,也可用作Vector(),因此当我向Color()添加标量时,它应该将该常量添加到每个单独的组件中。Vector()和Vector()添加需要按组件添加。此代码用于光线追踪器,因此任何速度提升都很棒。这是我的Vector()类的简化版本:classVector:def__init__(self,x,y,z):self.x=xself.y=yself.z=zdef__add__(se
我正在使用Python,每当我必须验证函数输入时,我都会假设输入有效,然后发现错误。在我的例子中,我有一个通用的Vector()类,我用它来做一些不同的事情,其中之一就是加法。它既可用作Color()类,也可用作Vector(),因此当我向Color()添加标量时,它应该将该常量添加到每个单独的组件中。Vector()和Vector()添加需要按组件添加。此代码用于光线追踪器,因此任何速度提升都很棒。这是我的Vector()类的简化版本:classVector:def__init__(self,x,y,z):self.x=xself.y=yself.z=zdef__add__(se
我有一个方法,我希望它能够接受单个字符串(路径,但不一定存在于运行代码的机器上)或字符串列表/元组。鉴于字符串充当字符列表,我如何判断该方法接收到的是哪种类型?我希望能够接受单个条目的标准或unicode字符串,以及多个列表或元组,因此isinstance似乎不是答案,除非我错过了一个聪明的技巧(比如利用共同的祖先类?)。Python版本是2.5 最佳答案 您可以检查变量是字符串还是unicode字符串Python3:isinstance(some_object,str)Python2:isinstance(some_object,
我有一个方法,我希望它能够接受单个字符串(路径,但不一定存在于运行代码的机器上)或字符串列表/元组。鉴于字符串充当字符列表,我如何判断该方法接收到的是哪种类型?我希望能够接受单个条目的标准或unicode字符串,以及多个列表或元组,因此isinstance似乎不是答案,除非我错过了一个聪明的技巧(比如利用共同的祖先类?)。Python版本是2.5 最佳答案 您可以检查变量是字符串还是unicode字符串Python3:isinstance(some_object,str)Python2:isinstance(some_object,
我目前无法构建hhvm,因为无法访问64位VM,所以我无法使用他们拥有的类型检查器。他们的文档似乎没有详细描述类型检查器(hh_server和hh_client?)的操作。我想知道的是,对于任何使用过它的人来说,是否可以在这种情况下使用类型检查器:假设某人无法将他们的PHP代码库转换为Hack,因此他们用hacklang类型注释形式的注释编写PHP,并在构建时使用工具去除注释,制作一个hh文件,运行类型检查器并报告错误。例如原始PHP:复制上面的内容,删除注释,将?php更改为?hh:通过类型检查器运行它,看看它是否产生错误。这样您就可以使用普通PHP进行合法类型检查,而无需在HHVM