Бесконечный цикл несовместим, когда я устанавливаю требования установки (Django1.99)

Это очень часто задаваемый вопрос. Давайте переименуем ваши типы:

abstract class Fruit { }                    // was BaseViewPresenter
abstract class FruitBowl where T : Fruit // was BaseView
class Apple : Fruit { }                     // was LoginPresenter
class BowlOfApples : FruitBowl {  }  // was LoginView

Теперь ваш вопрос:

У меня есть BowlOfApples, который наследуется от FruitBowl. Почему я не могу использовать его как FruitBowl? Яблоко - это плод, поэтому чаша с яблоками - это миска с фруктами.

Нет, это не так. Вы можете положить банан в миску с фруктами, но вы не можете положить банан в миску с яблоками, и поэтому чаша с яблоками - это не чаша с фруктами. (И по аналогичным соображениям, миска с фруктами также не является чашей из яблок.) Поскольку операции, которые вы можете законно выполнять на двух типах, отличаются , они не могут быть совместимыми .

Вот фотография легенды StackOverflow Jon Skeet, демонстрирующая этот факт:

enter image description here [/g6]

Вы хотите, чтобы функция общая контравариантность , и поддерживается только на интерфейсах интерфейсов и делегатов , когда компилятор может доказать, что дисперсия безопасна, а когда переменный тип является ссылкой тип. Например, вы можете использовать IEnumerable в контексте, где требуется IEnumerable, потому что компилятор может проверить, что вы не можете поместить Banana в последовательность фруктов.

Проведите поиск по «ковариации и ковариации C #» на этом сайте или в Интернете, и вы найдете гораздо больше информации о том, как работает эта функция. В частности, моя серия статей о том, как мы разработали и реализовали эту функцию на C # 4, начинается здесь: http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and- контрвариантность-в-с-часть-one.aspx

1
задан Roman Patutin 5 March 2019 в 06:46
поделиться

1 ответ

Насколько я вижу, у вас есть следующие опции:

  1. Запустите pip с аргументом --no-dependencies и надеюсь, что он просто сработает. pip install wechatpy --no-dependencies (или как называется пакет, я не знаком с ним), например. Это игнорирует зависимости при установке. Возможно, требования устарели, и это позволит вам продолжить. Для этого вам, скорее всего, нужно выполнить требование requests>=2.9.1, поэтому вы должны установить python-social-auth обычным образом, а затем попробовать другой пакет без зависимостей.
  2. Найдите более старые версии устанавливаемых пакетов, которые соответствуют требованиям. В зависимости от настроек вашего проекта это может оказаться невозможным, поскольку вам нужны функции более поздних версий (или старые версии могут быть небезопасными).
  3. Вы можете попробовать исправить одно из ваших требований локально (загрузить из исходного кода, изменить код, чтобы он работал с конфликтующей версией requests). А затем импортируйте локальную версию пакетов. Не забудьте убрать требование из requirements.txt вашего проекта в этом случае, чтобы другие люди, работающие над / использующие ваш проект, не сталкивались с той же проблемой, и включите локальную версию как часть проекта (отслеживайте ее в Git). Проверьте лицензию пакетов, которые вы модифицируете, чтобы увидеть, разрешено ли вам изменять и распространять их. (Необязательно: Сделайте запрос на извлечение пакетов на Github с вашими изменениями, чтобы другие люди могли воспользоваться ими)
  4. Замените один или оба пакета чем-то другим. Они могут просто не быть совместимыми или использовать локальную, измененную версию, может быть нежизнеспособной.
0
ответ дан Lomtrur 5 March 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: