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

时间:2018-10-19 14:19:21

标签: python python-import python-3.7

我正在尝试编写一个简单的字符串工具来生成随机字符串。

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

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

2 个答案:

答案 0 :(得分:2)

当然!

您可以使用如下目录结构来执行此操作: enter image description here

请注意,每个目录级别都需要这些 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))

答案 1 :(得分:0)

您应该尝试创建一个package,例如pk_utils或utils,并且string可以是您软件包中的模块/类之一。

在utils目录中创建stage('A'){ agent{docker{image A}} when{branch = 'master'} step{do blah} } stage('B'){ when{branch = 'master'} agent{docker{image B}} step{do blah} } 之后-

__init__.py

在您的代码中-

#!/usr/bin/env python

__all__ = [ "string" ]