首页
学习
活动
专区
圈层
工具
发布

FQDN验证
EN

Code Review用户
提问于 2020-01-11 16:11:05
回答 1查看 5.4K关注 0票数 6

我刚开始编程,我想让你检查一下我的工作,然后批评我。你会做什么不同的事?

FQDN:https://en.m.wikipedia.org/wiki/Fully_合资格_域名_名字

  • 253个字符不包括尾随点
  • Label1.Label2.Label3.adomain.com
  • 所有标签必须在1-63字符之间。
  • 不能以连字符(-)开始或结束
  • 可能只包含a-z、0-9和连字符。

这只是检查作为参数传递的主机名是否符合所有标准。

代码语言:javascript
复制
import re


def is_fqdn(hostname):
    """
    :param hostname: string
    :return: bool
    """
    #  Remove trailing dot
    try:  # Is this necessary?
        if hostname[-1] == '.':
            hostname = hostname[0:-1]
    except IndexError:
        return False

    #  Check total length of hostname < 253
    if len(hostname) > 253:
        return False

    #  Split hostname into list of DNS labels
    hostname = hostname.split('.')

    #  Define pattern of DNS label
    #  Can begin and end with a number or letter only
    #  Can contain hyphens, a-z, A-Z, 0-9
    #  1 - 63 chars allowed
    fqdn = re.compile(r'^[a-z0-9]([a-z-0-9-]{0,61}[a-z0-9])?我在带有返回语句的两个条件词之后声明了regex模式的变量。我的想法是,如果满足了先前的条件,为什么要存储一个未使用的变量?能写得更好吗?, re.IGNORECASE)

    #  Check if length of each DNS label < 63
    #  Match DNS label to pattern
    for label in hostname:
        if len(label) > 63:
            return False
        if not fqdn.match(label):
            return False

    #  Found no errors, returning True
    return True

我在带有返回语句的两个条件词之后声明了regex模式的变量。我的想法是,如果满足了先前的条件,为什么要存储一个未使用的变量?

能写得更好吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-01-11 19:04:14

评论:

  1. 使用类型声明!这些(IMO)比docstring注释更容易阅读,而且它们还使代码mypy-able。
  2. 您的try/catch块只是间接要求参数至少有一个字符长的一种方法。更明确的是,IMO只需要显式地检查长度,特别是因为您已经在做下一步了。
  3. 将一个不同的类型重新分配到一个现有的变量是在快速和肮脏的Python脚本中经常看到的事情,但这是不好的做法,IMO (而且mypy将把它视为一个错误,除非您转发--用一个棘手的Union类型声明它)。在生成具有新类型的新对象时,只需使用新变量名即可。
  4. 你的regex已经执行了63个字符的要求。干(不要重复)!
  5. 使用Python的内置all函数比滚动您自己的for循环要好。
代码语言:javascript
复制
import re

def is_fqdn(hostname: str) -> bool:
    """
    https://en.m.wikipedia.org/wiki/Fully_qualified_domain_name
    """
    if not 1 < len(hostname) < 253:
        return False

    # Remove trailing dot
    if hostname[-1] == '.':
        hostname = hostname[0:-1]

    #  Split hostname into list of DNS labels
    labels = hostname.split('.')

    #  Define pattern of DNS label
    #  Can begin and end with a number or letter only
    #  Can contain hyphens, a-z, A-Z, 0-9
    #  1 - 63 chars allowed
    fqdn = re.compile(r'^[a-z0-9]([a-z-0-9-]{0,61}[a-z0-9])?我赞同罗兰关于编写单元测试的建议。这样的函数很容易编写测试;您可以这样做:def test_is_fqdn() -> None:
    # Things that are FQDNs
    assert is_fqdn("homestarrunner.net")
    assert is_fqdn("zombo.com")

    # Things that are not FQDNs
    assert not is_fqdn("")
    assert not is_fqdn("a*")
    assert not is_fqdn("foo")  # no TLD means it's not a FQDN!注意,测试中的最后一个断言将失败., re.IGNORECASE)

    # Check that all labels match that pattern.
    return all(fqdn.match(label) for label in labels)

我赞同罗兰关于编写单元测试的建议。这样的函数很容易编写测试;您可以这样做:

A18

注意,测试中的最后一个断言将失败.

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/235473

复制
相关文章

相似问题

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