Как вы должны создавать свойства при использовании asyncio? - PullRequest
0 голосов
/ 04 марта 2019

При создании класса, который использует asyncio, я попал в ситуацию, когда получателю свойства необходимо выполнить операцию io.Поэтому функция должна быть сопрограммой.Однако ожидание собственности кажется необычным.

Вот минимальный пример того, что я имею в виду.Код действителен и работает.

import asyncio


class Person:
    """A class that represents a person"""

    def __init__(self, forename, surname):
        self.forename = forename
        self.surname = surname

    @property
    async def fullname(self):
        """Perform an io operation and return something.

        This could be looking something up in a database for example.        
        """
        await asyncio.sleep(0.1)
        return f"{self.forename} {self.surname}"


async def main():
    john = Person("John", "Smith")

    # Let's print out the forename here, using the standard property format
    print(john.forename)

    # When printing the full name we must instroduce an await, which feels awkward.
    print(await john.fullname)


# Start the loop and run the main function
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

Это правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Это правильный способ сделать это?

Это, за исключением стилистического вопроса о том, должно ли свойство возвращать ожидаемое. другой ответ противоречит практике на основе здравого смысла, но также и на основе следующей цитаты из PEP 8 :

Избегайте использования свойств длявычислительно дорогие операции;запись атрибута заставляет вызывающего абонента полагать, что доступ (относительно) дешев.

Как написано, это не означает, что свойства не должны возвращать ожидаемые по двум причинам:

  • Доступ к свойству с нотацией атрибута чрезвычайно дешев, поскольку он создает только ожидаемый (объект сопрограммы в случае сопрограммы).Только когда вы ожидаете получившийся объект, вы можете приостановить его, и это четко обозначено с помощью await.

  • Ожидание чего-либо не требует больших вычислительных затрат - на самом деле,запрещается делать что-то вычислительно дорогое в сопрограмме, потому что это мешало бы другим задачам.await либо сразу возвращает значение, либо приостанавливает вмещающую сопрограмму.Последнее, конечно, может занять время (но в этом весь смысл использования await), но это определенно не дорого с точки зрения процессора.

Я считаю, что идея предупреждения PEP8 заключается в том, что простой доступ к атрибуту не должен приводить к изменению состояния или длительной паузе.Как указывалось выше, это относится и к асинхронным свойствам, поскольку доступ дает только объект сопрограммы.С другой стороны, если вы затем явно перейдете к await этому объекту, вы не только разрешите, но и фактически запросите разрешение ожидаемого.Это не сильно отличается от того, как <some list>.append дает вам объект привязанного метода, ничего не делая, но если вы затем вызовете этот объект, вызов изменит список.

В заключение, если возвращается ожидаемое изсвойство "кажется неправильным", тогда просто не делайте этого и используйте вместо этого метод.Но PEP 8, насколько я могу судить, не против практики.

0 голосов
/ 04 марта 2019

Краткий ответ: не делайте этого.

Более длинный ответ: как упоминается в pep8 :

Избегайте использования свойств для вычислительно дорогих операций;запись атрибута заставляет вызывающего абонента полагать, что доступ (относительно) дешев.

Так что все, что требует ввода-вывода, очевидно, не является кандидатом на свойство.FWIW мы не только ожидаем, что доступ к атрибутам будет дешевым, мы также ожидаем, что они будут безопасными (ожидаете ли вы, что доступ к атрибутам может вызвать IOError, ошибку базы данных, ошибку сокета или что-то подобное?)

FWIWВы упоминаете, что «ожидание свойства кажется необычным », которое уже должно ответить на ваш вопрос.На самом деле, насколько я понимаю, сама идея «асинхронного свойства» кажется мне совершенно безумной - свойства (семантически) относятся к состоянию объекта, и я просто не могу понять концепцию «асинхронности».государство".

...