«Организовать входы», сценарий перерывов, что происходит? - PullRequest
1 голос
/ 06 ноября 2019

Сотрудник отправляет мне скрипт, который начинается так:

from ourlibA import *
from ourlibB import *
import random
import time
from datetime import datetime

print datetime.now()

, когда я вызываю скрипт таким образом, он работает хорошо.

Но я использую pycharm, и после внесения нескольких правок я также использовал функцию «упорядочить импорт», которая превратила импорт в:

import random
import time
from datetime import datetime

from ourlibA import *

from ourlibB import *

print datetime.now()

И когда я теперь запускаю этоизменив скрипт, я получаю:

print datetime.now ()

AttributeError: объект 'module' не имеет атрибута 'now'

Теперь я просто сбит с толку, приводя к следующим вопросам:

  • Что именно здесь может происходить? Импорт для datetime все еще там, так откуда же берется эта ошибка?
  • Очевидно, что проблема должна заключаться в том, что вторые примеры импортируют наши собственные библиотеки последними, а не первыми. Но как именно я могу узнать, какая часть наших библиотек вызывает это?

Я понимаю, что это не полный mcve, но эти частные библиотеки огромны и приватны. Я больше спрашиваю о том, как подойти к такой проблеме «порядка импорта» в python в целом.

(я использую python 2.7.17)

1 Ответ

0 голосов
/ 06 ноября 2019

Я выбрал подход "грубой силы" и просто вручную просмотрел операторы импорта частных библиотек (рекурсивно), чтобы определить тот, который делает

import datetime

Таким образом: когда эта библиотека импортируется последней, это противоречит предыдущему утверждению from datetime import datetime.

Два «быстрых решения» (больше: грязные хаки) работают, изменяя клиентский скрипт:

  • , удаляя from datetime import datetime
  • , используя «полный путь»print datetime.datetime.now() вместо

«Лучшее» решение: сделать шаг назад и избавиться от обоих from X import * подстановочных операторов. Требуется немного времени, чтобы определить все конкретные имена, которые требуются, но это определенно стоит потратить на это время.

...