Python:如何生成随机电话号码?

标签 python phone-number

不是 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

最佳答案

如果您使用的是 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())

关于Python:如何生成随机电话号码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36479550/

相关文章:

java - 获取联系人的照片和姓名

phone-number - 如何从规范化的电话号码中识别国家?

python - 打印 CatBoost 超参数

python - 使用 Python 在闭区间上查找函数的最小值

jquery - 如何序列化发布到 django 后端的数组

android - 获取所有安卓版本的来电电话号码

php - 两个 MySQL 表之间的最长前缀

Python Mechanize 阻止连接 :Close

python - 基于 Django 类的 View - 将所有代码放在 urls.py 中是一种不好的风格吗?

c# - 如何使用正则表达式检查电话号码