Alen
С чего вы это взяли? Ну если я дал ссылку на PEP8, где собственно это соглашение и описано, вы думаете я его не читал?
Я думаю, вы не очень понимаете , зачем оно надо.
Возьмём конкретный пример - фреймворк Django. С его ОРМ мы можем работать как то так:
obj = model.objects.get(pk=pk)
for name, value in model_to_dict(obj).iteritems():
verbose_name = getattr(obj._meta.get_field(name), "verbose_name", None)
obj._meta - вот в этом месте я использую атрибут класса, не предназначенный для того, чтобы я его использовал. Разработчики джанги меня предупреждают: не трогай! не лезь! Завтра мы выкатим незначительное обновление, которое к хренам собачьим убьёт весь твой код, потому что по только нам известным соображениям мы переименуем метод get_field или перенесем его куда-нибудь в другое место.
Вот так вот нам хочется. А для тебя (для меня то есть) есть куча методов и свойств без подчеркивания,
это документированные свойства и методы, сигнатуры которых мы не будем изменять ради обратной совместимости. Поскольку я использую джангу извращенным способом и пытаюсь от неё добиться того, чего она не умеет, я на свой страх и риск обращаюсь к атрибутам с подчеркиванием.
Другой пример - свойство query. Мы пишем как то так
queryset = MyModel.objects.all()
У полученного объекта queryset есть свойство query. Это свойство только для чтения. Зачем оно нужно? Да для отладки, особого практического смысла в том, чтобы увидеть SQL-код запроса нет, кроме случаев, когда что-то пошло не так и мы разбираемся, какого же чёрта запрос возвращает не то, что нужно. Понятно, что изменять это свойство нельзя ни в коем случае.