Это правильный способ сделать это?
Это, за исключением стилистического вопроса о том, должно ли свойство возвращать ожидаемое. другой ответ противоречит практике на основе здравого смысла, но также и на основе следующей цитаты из PEP 8 :
Избегайте использования свойств длявычислительно дорогие операции;запись атрибута заставляет вызывающего абонента полагать, что доступ (относительно) дешев.
Как написано, это не означает, что свойства не должны возвращать ожидаемые по двум причинам:
Доступ к свойству с нотацией атрибута чрезвычайно дешев, поскольку он создает только ожидаемый (объект сопрограммы в случае сопрограммы).Только когда вы ожидаете получившийся объект, вы можете приостановить его, и это четко обозначено с помощью await
.
Ожидание чего-либо не требует больших вычислительных затрат - на самом деле,запрещается делать что-то вычислительно дорогое в сопрограмме, потому что это мешало бы другим задачам.await
либо сразу возвращает значение, либо приостанавливает вмещающую сопрограмму.Последнее, конечно, может занять время (но в этом весь смысл использования await
), но это определенно не дорого с точки зрения процессора.
Я считаю, что идея предупреждения PEP8 заключается в том, что простой доступ к атрибуту не должен приводить к изменению состояния или длительной паузе.Как указывалось выше, это относится и к асинхронным свойствам, поскольку доступ дает только объект сопрограммы.С другой стороны, если вы затем явно перейдете к await
этому объекту, вы не только разрешите, но и фактически запросите разрешение ожидаемого.Это не сильно отличается от того, как <some list>.append
дает вам объект привязанного метода, ничего не делая, но если вы затем вызовете этот объект, вызов изменит список.
В заключение, если возвращается ожидаемое изсвойство "кажется неправильным", тогда просто не делайте этого и используйте вместо этого метод.Но PEP 8, насколько я могу судить, не против практики.