以下是我目前所掌握的情况:
def is_ordered(collection):
if isinstance(collection, set):
return False
if isinstance(collection, list):
return True
if isinstance(collection, dict):
return False
raise Exception("unknown collection")
有更好的方法吗?在
NB:我的意思是有序的,不是排序的。在
动机:
我想迭代一个有序的集合。e、 g
^{2}$在这种情况下,优先次序是很重要的。这是什么样的收藏不是。我在试着活生生地打字。我经常被劝阻不要让Python进行类型检查。在
如果集合确实是任意的(意味着它可以是任何类别的),那么答案必须是否。在
基本上,有两种可能的方法:
后者显然是不可行的。前者与您已有的类似,只是您必须了解每个派生的类,比如}是不够的。在
collections.OrderedDict
;检查{坦白地说,我认为整个
is_ordered
检查是一堆蠕虫。你为什么要这么做?在我认为枚举90%的大小写就和你将得到的一样好(如果使用python3,用str替换basestring)。可能还需要考虑如何处理生成器表达式和类似的ilk(同样,如果使用Py3,请跳过xrangor):
如果呼叫者开始使用itertools,那么还需要添加islice、imap、groupby返回的itertools类型。但这些特殊情况的数量确实开始指向code smell。在
更新:实际上,您是在尝试对传递给您的参数进行单元测试。停止这样做,对你自己的代码进行单元测试。测试您的使用者(确保它能与有序集合一起工作),并对调用它的代码进行单元测试,以确保它获得正确的结果。在
在静态类型语言中,您只需将自己限制为特定类型。如果您真的想复制它,只需指定您接受的类型,并测试这些类型。如果传递了任何其他内容,则引发异常。它不是Python,但它可靠地实现了你想做的事
你有两种可能的方法:
append
方法的东西几乎肯定是有序的;并且add
方法,您可以尝试添加一个nonce值,然后迭代该集合以查看该nonce是否出现在末尾(或者,可能出现在一端);您可以尝试添加第二个nonce,然后再次执行该操作,以便更加自信。在当然,如果集合是空的,或者有一个排序函数不能在结尾处产生加法,那么这是行不通的。在
也许更好的解决方案是简单地指定代码需要有序集合,而只传递有序集合。在
相关问题 更多 >
编程相关推荐