Нельзя полагаться на is
, работающую со строковыми литералами.Даже когда это работает, это деталь реализации CPython, и в этом случае, даже реализация CPython не поддерживает его, потому что CPython только автоматически интернирует строковые литералы, которые соответствуют правилам для идентификаторов (то есть имен переменных).Ваша строка содержит .
s, что означает, что она не автоматически интернируется.Вы можете легко увидеть это в интерактивном режиме:
>>> x = 'shapely.geometry.base' # Not a legal variable name
>>> y = 'shapely.geometry.base'
>>> x is y
False
>>> x = 'abc123' # Legal variable name
>>> y = 'abc123'
>>> x is y
True
Как правило, измените свой тест на != 'shapely.geometry.base'
, и, если вам нужна дополнительная информация, прочитайте разницу между is
и ==
.
Замечу, что ваш тест некорректен в других отношениях.Прямо сейчас вам требуется, чтобы непосредственный родитель был определен в shapely.geometry.base
.Но если вы создадите подкласс действительного класса, дочерний элемент будет недействительным (потому что __base__
будет ссылаться на подкласс из другого модуля, а не на базовый класс в shapely.geometry.base
).Лучшим решением является правильная isinstance
проверка на основе известных хороших базовых классов, например:
# Top of file
from shapely.geometry.base import BaseGeometry, GeometrySequence
# Test code (passing a tuple of legal bases classes is allowed)
if not isinstance(footprint, (BaseGeometry, GeometrySequence)):
raise TypeError('footprint input geometry is not a shapely geometry based object')
, которая помимо того, чтобы быть более явным в отношении того, что вы хотите (явное перечисление легальных базовых классов), и возможность косвенногоподклассы рассматриваемых классов, а не только прямые подклассы горстки базовых классов из этого модуля, избегают использования ложных типов, таких как CAP_STYLE
и JOIN_STYLE
(которые, хотя и определены в shapely.geometry.base
, по-видимому, существуют в основном в виде простого перечисления-подобные классы констант, а не фактические вещи, связанные с геометрией, и, вероятно, не те типы, которые вы бы хотели разрешить).