Size: a a a

2021 March 14

MB

M B in SPb Python
в пепах не могу найти каких-то конкретных рекомендаций
источник

MB

M B in SPb Python
в том же руби применяют второй вариант и первый считается неприемлимым
источник

MB

M B in SPb Python
но в коде питона у других я часто встречаю именно первый вариант
источник

S

Stan in SPb Python
M B
в пепах не могу найти каких-то конкретных рекомендаций
Если только нет весомых причин делать иначе (например, аргументы из конфига достаёшь), всегда лучше брать первый, потому что с ним и любой редактор/IDE сможет работать, и типизировать переменные можно, и в целом читается гораздо лучше.
источник

S

Stan in SPb Python
M B
в том же руби применяют второй вариант и первый считается неприемлимым
Есть ссылки на аналог PEP для Ruby про это? Очень любопытно.
источник
2021 March 15

AG

Andrey Golynskiy in SPb Python
M B
в том же руби применяют второй вариант и первый считается неприемлимым
А в Руби можно задавать аргументы при вызове функции по именам? По-моему, там нет такого синтаксиса. Потому и пользуются словарями.
источник

DI

Danil Ivanov in SPb Python
Andrey Golynskiy
А в Руби можно задавать аргументы при вызове функции по именам? По-моему, там нет такого синтаксиса. Потому и пользуются словарями.
Конечно можно просто это выглядит как словарь ) хотя таковым и является )

write(data: 123, file: "test.txt")
источник

AG

Andrey Golynskiy in SPb Python
Ну, то есть, специального синтаксиса нет, но можно использовать словарь, у которого необязательно ставить скобки.
источник

MA

Maxim Afanasev in SPb Python
Andrey Golynskiy
Ну, то есть, специального синтаксиса нет, но можно использовать словарь, у которого необязательно ставить скобки.
Ну вроде это и есть специальный синтаксис?
источник

ВЩ

Взщз Щщщхш in SPb Python
в питоне то же самое, только с генераторным выражением 🤔
источник

AG

Andrey Golynskiy in SPb Python
По-моему, это стандартный синтаксис, который приспособили для передачи аргументов.
источник

MA

Maxim Afanasev in SPb Python
Maxim Afanasev
Ну вроде это и есть специальный синтаксис?
В дарте так же работает, передача параметров через двоеточие, а в объявлении функции - фигурные скобки. Хорошее решение, кмк
источник

AG

Andrey Golynskiy in SPb Python
Это object destructuring значит. В новых версиях JS тоже так можно.
источник
2021 March 16

М

М in SPb Python
Кто может помочь с задачей со циклами?
источник

YV

Yuliya Volkova in SPb Python
просто задачу кидай и вопрос
источник
2021 March 17

DS

David Shiko in SPb Python
Всем привет. Оцените пожалуйста код, правильно ли я использовал async/await ? Задача - асинхронно скачать файлы по ссылкам из html таблицы

import asyncio
import aiofiles
from aiohttp import ClientSession as aiohttp_ClientSession
from bs4 import BeautifulSoup
from pathlib import Path as pathlib_Path


async def load_page(url: str, session, ):
   async with session.get(url=url, ) as resp:
       return await resp.read()


async def save_pdf(rows, session):
   for row in rows:
       resp = await load_page(url=row, session=session)
       pathlib_Path(row).mkdir(parents=True, exist_ok=True)  # exist_ok - skip FileExistsError
       async with aiofiles.open(file=row, mode='wb') as f:
           await f.write(resp)


async def main():
   async with aiohttp_ClientSession() as session:
       tasks = []
       pagination = 0
       while 1:
           url = f'https://example.com?shift={pagination}'
           page = await load_page(url=url, session=session)
           soup = BeautifulSoup(page, 'html.parser')
           rows = soup.find_all(name='tr')[1:]  # [1:] - Just wrong HTML
           if rows:
               tasks.append(await save_pdf(rows=rows, session=session))
               pagination += 1
           else:  # Stop pagination
               break
       await asyncio.gather(*tasks)


if __name__ == '__main__':
   asyncio.run(main())
источник
2021 March 18

A

Alexander in SPb Python
David Shiko
Всем привет. Оцените пожалуйста код, правильно ли я использовал async/await ? Задача - асинхронно скачать файлы по ссылкам из html таблицы

import asyncio
import aiofiles
from aiohttp import ClientSession as aiohttp_ClientSession
from bs4 import BeautifulSoup
from pathlib import Path as pathlib_Path


async def load_page(url: str, session, ):
   async with session.get(url=url, ) as resp:
       return await resp.read()


async def save_pdf(rows, session):
   for row in rows:
       resp = await load_page(url=row, session=session)
       pathlib_Path(row).mkdir(parents=True, exist_ok=True)  # exist_ok - skip FileExistsError
       async with aiofiles.open(file=row, mode='wb') as f:
           await f.write(resp)


async def main():
   async with aiohttp_ClientSession() as session:
       tasks = []
       pagination = 0
       while 1:
           url = f'https://example.com?shift={pagination}'
           page = await load_page(url=url, session=session)
           soup = BeautifulSoup(page, 'html.parser')
           rows = soup.find_all(name='tr')[1:]  # [1:] - Just wrong HTML
           if rows:
               tasks.append(await save_pdf(rows=rows, session=session))
               pagination += 1
           else:  # Stop pagination
               break
       await asyncio.gather(*tasks)


if __name__ == '__main__':
   asyncio.run(main())
Path.mkdir - синхронная блокирующая операция. На ней вся работа скрипта будет стопаться.
В целом, это не проблема если файловая система быстрая, но если там какой нибудь гластерфс, то можно прямо так неплохо замедлиться.
источник

DS

David Shiko in SPb Python
Alexander
Path.mkdir - синхронная блокирующая операция. На ней вся работа скрипта будет стопаться.
В целом, это не проблема если файловая система быстрая, но если там какой нибудь гластерфс, то можно прямо так неплохо замедлиться.
Спасибо, упустил этот момент, что не только запись на диск, но и создание директории занимает время.
источник

A

Alexander in SPb Python
Вариант - поискать библиотеку для асинхронной работы с файловой системой. Ещё вариант - запускать эту операцию в соседнем треде или процессе через run_in_executor
источник

II

Ilya Ilyinykh in SPb Python
David Shiko
Спасибо, упустил этот момент, что не только запись на диск, но и создание директории занимает время.
Вообще там aiofiles так и работает под капотом, вроде, когда я смотрел.
Там не настоящая асинхронная работа с файлами. Там используется run_in_executor, да, но там для нег опередается None как параметр, дефолт берется самим `concurrent.futures.ThreadPoolExecutor`. В доке у тебя там инфа по тому сколько потоков в нем.

Я как-то искал где по-честному работа с файлома асинхронная, но не нашел, поэтому это наверное лучший способ без костыле. Если кто подскажет как честно работать асинхронно с файлами (AIO) — будет круто. Вроде есть Linux AIO, но я не нашёлся чтобы его пользовали прям где-то.
источник