Я пытаюсь выяснить, является ли это ошибкой в моем проекте или ошибкой в библиотеке redis-pyПо сути, мое понимание пространства имен в Python заключается в том, что пакеты должны разрабатываться так, чтобы все компоненты находились в пространстве имен пространства имен пакетов. Это означает, что если у меня есть очередь в packageA и очередь в packageB, то не должно быть никаких коллизий, поскольку они имеют пространство имен (packageA.queue и packageB.queue). Тем не менее, я сталкиваюсь с ошибкой в пакете, который создаю.
Это структура каталогов для создаваемого пакета:
○ → tree
.
├── __init__.py
├── net
│ ├── __init__.py
│ ├── rconn.py
└── test.py
Все файлы __init__.py
опорожнить. Вот код моего файла test.py:
○ → cat test.py
from net import rconn
, а вот код из моего файла net / rconn.py:
○ → cat net/rconn.py
import redis
Запуск test.py, все работает, нетошибки. Однако, если я добавлю каталог очереди и создам пустой файл init.py внутри, вот новое дерево:
○ → tree
.
├── __init__.py
├── net
│ ├── __init__.py
│ ├── rconn.py
├── queue
│ ├── __init__.py
└── test.py
Запуск test.py приводит к следующей ошибке:
Traceback (most recent call last):
File "test.py", line 1, in <module>
from net.rconn import ass
File "/Users/yosoyunmaricon/python_test/net/rconn.py", line 1, in <module>
import redis
File "/usr/local/lib/python3.7/site-packages/redis/__init__.py", line 1, in <module>
from redis.client import Redis, StrictRedis
File "/usr/local/lib/python3.7/site-packages/redis/client.py", line 10, in <module>
from redis._compat import (b, basestring, bytes, imap, iteritems, iterkeys,
File "/usr/local/lib/python3.7/site-packages/redis/_compat.py", line 139, in <module>
from queue import Queue
ImportError: cannot import name 'Queue' from 'queue' (/Users/yosoyunmaricon/python_test/queue/__init__.py)
Итак, я понял, что происходит. Код Redis говорит from queue import Queue
, и когда я создаю пустой каталог очереди (т.е. без очереди), он нарушает пакет. У меня такой вопрос: это хороший дизайн? Должен ли пакет Redis быть более явным и говорить что-то вроде from redis.queue import Queue
, или это просто ошибка в моем собственном дизайне?