Локальный каталог теневого стороннего пакета - PullRequest
3 голосов
/ 22 декабря 2019

Я пытаюсь выяснить, является ли это ошибкой в ​​моем проекте или ошибкой в ​​библиотеке 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, или это просто ошибка в моем собственном дизайне?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...