Py学习  »  Python

python-返回前验证电话号码

CodeSpent • 6 年前 • 1633 次点击  

考虑到我使用的数据源非常脏,并且可以在“电话号码”字段中包含一些以下内容;

  • 空(新标准)
  • !闭嘴!!
  • 没有人

我正在做一个大规模的进口,想确保只是不打扰这些。所以我要过滤一个类来格式化数字,但我也要验证它,如果它不是一个数字,就扔掉它。

class PhoneNumber:
        def __init__( self, number_raw ):
                number = re.sub('[^0-9]', '', number_raw)
                self.area_code= number[ 0:3 ]
                self.exchange = number[ 3:6 ]
                self.line = number[ 6:13 ]

        def __str__( self ):
                return "({0}) {1}-{2}".format( self.area_code, self.exchange, self.line )

有几点需要考虑:

  • 我无法修改实际的数据源
  • 我不能在上课前验证

我想我可以这样做,然后用if语句来传递 False 如果这不是一个有效的数字,但我觉得这可能是草率的。

有什么更好的方法来验证它只是数字输入,如果字符串输入,则将其抛出&return None ?


潜在解决方案1:

class PhoneNumber:
        def __init__( self, number_raw ):
                validation = re.match('[^0-9]', '', number_raw)
                if validation is False:
                    return None
                else:
                    number = re.sub('[^0-9]', '', number_raw)
                    self.area_code= number[ 0:3 ]
                    self.exchange = number[ 3:6 ]
                    self.line = number[ 6:13 ]
                    self.full_number = number

        def __str__( self ):
                return "({0}) {1}-{2}".format( self.area_code, self.exchange, self.line )

潜在溶质2:

class PhoneNumber:
        def __init__( self, number_raw ):
            number = re.sub('[^0-9]', '', number_raw)
            self.area_code = number[ 0:3 ]
            self.exchange = number[ 3:6 ]
            self.line = number[ 6:13 ]
            self.og_number = number_raw

        def __str__( self ):
                validation = re.match('[^0-9]', '', self.og_number)
                if validation is False:
                    return None
                return "({0}) {1}-{2}".format( self.area_code, self.exchange, self.line )
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43841
文章 [ 2 ]  |  最新文章 6 年前
Chris Curvey
Reply   •   1 楼
Chris Curvey    7 年前

也许只需要在 初始化 在那里决定你是否有一个有效的号码?

class FormattedPhoneNumber(object):
  def __init__(self, number):
    try:
      as_number = int(number)
    except (TypeError, ValueError):
      self._formatted = None
    else:
      # you have a number, do whatever formatting you need to do
      area_code = number[ 0:3 ]
      exchange = number[ 3:6 ]
      line = number[ 6:13 ]
      self._formatted = "({0}) {1}-{2}".format(area_code,exchange,line)

  def __str__(self):
    return self._formatted
needtobe
Reply   •   2 楼
needtobe    7 年前

没有理由实例化所有字段都设置为“无”的对象。 我会检查一下 __init__ 像这样:

class PhoneNumber:
    def __init__(self, number_raw):
        number = int(number_raw)  # do not catch exception here, catch it on instantiation
        number_str = str(number)  # parse to str for slicing

        self.areaCode = number_str[0:3]  # note no space around slicing indexes
        self.exchange = number_str[3:6]
        self.line = number_str[6:13]

另外,值得注意的是使用pep-8类变量,所以使用 area_code 而不是 areaCode .

第二种方式(使用ClassMethod)

如果你需要回来 None 出于某些原因,您可能会发现使用ClassMethod实例化很有用,例如:

class PhoneNumber:
    def __init__(self, number_raw):
        self.areaCode = number_raw[0:3] 
        self.exchange = number_raw[3:6]
        self.line = number_raw[6:13]

    @classmethod
    def instantiate_with_checks(cls, number_raw):
        try:
            int(number_raw)
        except ValueError:
            return None
        # after ensuring that provided variable is valid
        return cls(number_raw)

实例化新 PhoneNumber 像这样的对象: PhoneNumber.instantiate_with_checks(number_raw) .

第三种方式(使用 __new__ ):

class PhoneNumber:
    def __init__( self, number_raw ):
        self.area_code = number[0:3]
        self.exchange = number[3:6]
        self.line = number[6:13]

    @classmethod
    def is_number_valid(cls, number_raw):
        try:
            int(number_raw)
        except ValueError:
            return False
        return True

    def __new__(cls, number_raw):
        if cls.is_number_valid(number_raw):
            return super().__new__(cls)