【问题标题】:A module that has the same name as a module in standard library and also need to import the same module与标准库中的模块同名的模块,也需要导入相同的模块
【发布时间】:2018-10-19 14:19:20
【问题描述】:

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

我在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

【问题讨论】:

    标签: python python-import python-3.7


    【解决方案1】:

    当然!

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

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

    【讨论】:

    • ai...我太傻了...我在utils 目录中启动了交互式shell。所以这是行不通的。我在app 目录中尝试过,它可以工作。非常感谢!
    【解决方案2】:

    你应该尝试创建一个package 说 pk_utils 或 utils 并且字符串可以是你包中的模块/类之一。

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

    #!/usr/bin/env python
    
    __all__ = [ "string" ]
    

    在您的代码中 -

    from utils import string #  instead of import string
    
    string.generate_random_letters()
    

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 2011-10-29
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多