【问题标题】:Python: How to generate a random phone number?Python:如何生成随机电话号码?
【发布时间】:2016-04-07 14:41:18
【问题描述】:

不是Making random phone number xxx-xxx-xxxx的重复项

我的项目使用python-phonenumbersdjango-phonenumber-field 进行电话号码验证。项目中有大量的自定义验证规则列表,像这样幼稚的方法是不够的:

>>> import functools
>>> import random
>>> a = functools.partial(random.randint, 0, 9)
>>> gen = lambda: "+{}-{}{}{}-{}{}{}-{}{}{}{}".format(a(), a(), a(), a(), a(), a(), a(), a(), a(), a(), a())
>>> gen()
'+2-758-702-0180'  # Obviously wrong
>>> gen()
'+1-911-555-0180'  # Obviously wrong, it has 911 in it

那么,如果不使用没有上限的蛮力 while 循环,也不为此类琐碎的问题引入上限,那么有什么更好的方法来生成验证器本身接受的有效电话号码?

from phonenumber_field.validators import validate_international_phonenumber
from django.core.exceptions import ValidationError

def generate_valid_number():
    while True:  # While loops are not desired, even with an upper bound!
        try:
            number = gen()
            validate_international_phonenumber(number)
            return number
        except ValidationError:
            pass

【问题讨论】:

标签: python phone-number


【解决方案1】:

如果您正在使用包faker,您可以编写一个可以在您的项目中重复使用的自定义提供程序。

import phonenumbers
from faker.providers.phone_number.en_US import Provider

class CustomPhoneProvider(Provider):
    def phone_number(self):
        while True:
            phone_number = self.numerify(self.random_element(self.formats))
            parsed_number = phonenumbers.parse(phone_number, 'US')
            if phonenumbers.is_valid_number(parsed_number):
                return phonenumbers.format_number(
                    parsed_number,
                    phonenumbers.PhoneNumberFormat.E164
                )

factory_boy一起使用:

import factory
from faker import Faker

from .models import User
from .providers import CustomPhoneProvider

fake = Faker()
fake.add_provider(CustomPhoneProvider)

class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    phone_number = factory.LazyAttribute(lambda _: fake.phone_number())

【讨论】:

  • faker 的代码示例帮助我在我的 api 自动化测试套件中验证了我随机生成的电话号码。谢谢@bdouble
【解决方案2】:

我认为 davidn 给 this question 的答案应该会起作用,尤其是因为您已经在使用 python-phonenumbers

我建议使用 Python 的 phonenumbers 包 Google 的 libphonenumber 端口,其中包括移动数据集 运营商现在:

import phonenumbers 
from phonenumbers import carrier
from phonenumbers.phonenumberutil import number_type

number = "+49 176 1234 5678"
carrier._is_mobile(number_type(phonenumbers.parse(number))) 

这将 如果 number 是手机号码,则返回 True,否则返回 False。笔记 该号码必须是有效的国际号码或例外 将被抛出。您还可以使用电话号码来解析电话号码 给出区域提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-18
    • 2016-10-22
    • 1970-01-01
    • 2022-11-16
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多