首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中为嵌套列表和基本类型设置类型检查器?

如何在python中为嵌套列表和基本类型设置类型检查器?
EN

Stack Overflow用户
提问于 2015-07-16 15:38:44
回答 4查看 118关注 0票数 0

如果我需要为基本类型编写类型验证器(其中包括嵌套列表),那么标准方法是什么?

也就是说,如果给我一个值a和一个字符串list<list<int>>,如何检查a实际上是一个list of list of ints?

有没有毕达通的方法来解决这个问题?

注意:我知道Python与鸭子类型有关,只是在这种情况下,我需要进行一些验证,因为数据将被传递到另一个系统。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-16 15:41:12

您可以使用isinstance检查某物的类型。

代码语言:javascript
复制
def is_list_of_list_of_int(a):
    return isinstance(a, list) and isinstance(a[0], list) and isinstance(a[0][0], int)

>>> is_list_of_list_of_int([[1,2,3],[2,3,4]])
True
>>> is_list_of_list_of_int(5)
False

另一种方法是“请求宽恕胜于许可”。

代码语言:javascript
复制
def get_value_safe(a, i, j):
    try:
        return a[i][j]
    except TypeError:
        print('not a list of list')
        return None

>>> get_value_safe([[1,2,3],[2,3,4]], 1, 2)
4
>>> get_value_safe([1,2,3], 1, 2)
not a list of list
票数 0
EN

Stack Overflow用户

发布于 2015-07-16 17:53:23

我必须承认,这是我多年来第一次接触递归,但我认为检查对象的每一项的唯一方法是递归。或者动态规划,而我不喜欢动态规划:P

我绝对不喜欢解析字符串,所以我选择只传递类型。

代码语言:javascript
复制
def typecheck(obj, *args):
    if isinstance(obj, args[0]):
        if len(args) == 1: # last one to check. Base case.
            return True
        if hasattr(args[0], "__iter__"): 
            #in other words, am I an iterator?
            for i in obj:
                if not typecheck(i, *args[1:]):
                    return False
            return True
     else: 
        return False

In [23]: typecheck([[3,3, "a"]],list, list, int)
Out[23]: False

In [24]: typecheck([[3,3]],list, list, int)
Out[24]: True

添加logging应该非常简单,因为一个变体只会告诉您对象在哪里是错误的类型。

票数 1
EN

Stack Overflow用户

发布于 2015-07-16 16:37:49

假设您只想检查列表和基本类型,答案的第一部分是将类型规范解析为类型列表(从父类型到子类型):

代码语言:javascript
复制
import __builtin__
def parse_spec(str_spec):
    return [getattr(__builtin__, x) for x in str_spec.rstrip('>').split('<')]

第二部分是验证指定的值是否符合规范:

代码语言:javascript
复制
def validate(value, spec):
    for t in spec:
        if not isinstance(value, t):
            return False
        try:
            value = value[0]
        except TypeError:
            pass
    return True

因此,您可以按照以下方式组合这些功能:

代码语言:javascript
复制
>>> validate([10], parse_spec('list<int>'))
True
>>> validate([10], parse_spec('int'))
False
>>> validate([['something']], parse_spec('list<list<str>>'))
True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31458695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档