Модуль, имя которого совпадает с именем модуля в стандартной библиотеке, а также необходимо импортировать тот же модуль - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь написать простую строку для создания случайной строки.

У меня есть string.py в utils dir со следующим кодом:

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.py, my_string.py, string_util.py

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Конечно!

Вы можете сделать это с такой структурой каталогов: 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))
0 голосов
/ 19 октября 2018

Вы должны попытаться создать пакет , скажем, pk_utils или utils, и строка может быть одним из модулей / классов в вашем пакете.

После того, как вы создали __init__.py вкаталог утилит -

#!/usr/bin/env python

__all__ = [ "string" ]

В вашем коде -

from utils import string #  instead of import string

string.generate_random_letters()
...