Можно ли проверять свойства, начиная с подчеркивания? - PullRequest
3 голосов
/ 30 сентября 2008

Я работал над очень простым генератором сырой нефти для пилонов. Я придумал что-то, что проверяет

SomeClass._sa_class_manager.mapper.c

Можно ли это проверить (или вызвать методы, начинающиеся с подчеркивания)? Я всегда предполагал, что это законно, хотя и осуждается, так как оно сильно зависит от внутренней структуры класса / объекта. Но, эй, поскольку у python на самом деле нет интерфейсов в смысле Java, возможно, все в порядке.

Ответы [ 4 ]

8 голосов
/ 30 сентября 2008

Это намеренно (в Python), что нет "частных" областей. Это соглашение, что все, что начинается с подчеркивания, в идеале не должно использоваться, и, следовательно, вы не можете жаловаться, если его поведение или определение изменятся в следующей версии.

8 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

Как правило, это не очень хорошая идея по причинам, уже упомянутым. Однако Python сознательно допускает такое поведение в случае, если нет другого способа что-либо сделать.

Например, если у вас есть скомпилированная библиотека Python с закрытым исходным кодом, автор которой не думал, что вам нужен прямой доступ к внутреннему состоянию определенного объекта & mdash; но вы действительно делаете & mdash; вы все равно можете получить необходимую информацию , У вас были те же проблемы, о которых говорилось ранее, чтобы идти в ногу с разными версиями (если вам повезло, что он все еще поддерживается), но, по крайней мере, вы действительно можете делать то, что хотели.

0 голосов
/ 30 сентября 2008

Если это работает, то почему бы и нет? Однако могут возникнуть проблемы при реструктуризации _sa_class_manager, привязке к этой конкретной версии SQLAlchemy или создании дополнительной работы для отслеживания изменений. Поскольку SQLAlchemy - быстро движущаяся цель, вы можете быть там уже через год.

Предпочтительным способом было бы интегрировать желаемый API в саму SQLAlchemy.

...