与标准库中的模块同名的模块,也需要导入相同的模块

A module that has the same name as a module in standard library and also need to import the same module

我正在尝试编写一个简单的字符串实用程序来生成随机字符串。

我在 utils 目录中有 string.py,代码如下:

import string
import random


def generate_random_letters(str_len: int) -> str:
    return ''.join(random.choice(string.ascii_letters) for _ in range(str_len))

我在交互式控制台中试过了...

>>> from string import generate_random_letters
>>> generate_random_letters(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "xxx\app\utils\string.py", line 6, in generate_random_letters
    return ''.join(random.choice(string.ascii_letters) for _ in range(str_len))
  File "xxx\app\utils\string.py", line 6, in <genexpr>
    return ''.join(random.choice(string.ascii_letters) for _ in range(str_len))
AttributeError: module 'string' has no attribute 'ascii_letters'

我尝试将 string.py 更改为 strings.py 并且有效。所以冲突的名字是第一个原因

我也尝试删除 import string 并简单地执行

return ''

并且有效。所以这是第二个原因。

我的目标

import app.utils.string as string_util
string_util.generate_random_letters(10)

python3.7 可以吗?

如果不可能,我肯定需要更改文件名。

但也请随时为此类特定案例建议任何好的名称 但是,老实说,我认为以下任何一项都不好

_string.pymy_string.pystring_util.py

你应该尝试创建一个 package 说 pk_utils 或者 utils 和字符串可以是你包中的 modules/classes 之一。

在 utils 目录中创建 __init__.py 后 -

#!/usr/bin/env python

__all__ = [ "string" ]

在你的代码中 -

from utils import string #  instead of import string

string.generate_random_letters()

好的!

您可以使用这样的目录结构来执行此操作:

请注意,每个目录级别都需要那些 init.py 文件。

我的 string.py 代码与你的匹配:

import string
import random


def generate_random_letters(str_len: int) -> str:
    return ''.join(random.choice(string.ascii_letters) for _ in range(str_len))

我的aa_test_me.py代码:

import app.utils.string as string_util

print (string_util.generate_random_letters(10))