数据类型`NoneType`比较?

时间:2018-12-25 11:45:24

标签: python python-3.x

我正在尝试使用1-65535验证URL中的端口号(范围urlparse)。

棘手的部分是,如果URL中没有端口号,则urlparse(url).port被标识为NoneType

因此,我试图根据数据类型进行简单的比较,但实际上并没有奏效,如本例所示。

如果我使用NoneType作为数据类型,

elif type(u.port) == NoneType:

我遇到错误

NameError: name 'NoneType' is not defined

我没有使用validators,因为它无法正确验证端口号。

Python: `validators.url` does not accept port number from 1-9, but accept port bigger than 65535?

TCP / UDP端口号范围从1-65535开始。但是,validators无法识别端口1-9,并且仍然接受大于65535的无效端口。

代码

from urllib.parse import urlparse

def test(url):
    global u
    u = urlparse(url)
    print(' Port      : ', u.port)
    print(' Data Type : u.port %s\n'% type(u.port))

for url in ['example.com', 'example.com:1', 'http://example.com:1']:
    print(url)
    test(url)
    if type(u.port) == int:
        print(' Integer')
    elif type(u.port) == None:
        print(' None')
    # elif type(u.port) == NoneType:        # NameError: name 'NoneType' is not defined
    #   print(' None')

输出

example.com
 Port      :  None
 Data Type : u.port <class 'NoneType'>

example.com:1
 Port      :  None
 Data Type : u.port <class 'NoneType'>

http://example.com:1
 Port      :  1
 Data Type : u.port <class 'int'>

    Integer

2 个答案:

答案 0 :(得分:7)

不要比较类型以检查None,请使用:

elif u.port is None:
    print(' None')

答案 1 :(得分:2)

您还可以通过以下方式检查NoneType:

unpivot