Цена за 24 часа в ленте | 600,00 |
Цена за 1 час закрепления | 100,00 |
Взаимопиар | ≥ 600 подписчиков |
Казино, мошенничества, пирамиды, ставки и всё в этом духе. |
|
# Стадия сборки
FROM golang:1.20-alpine AS builder
WORKDIR /app
# Копируем только нужные файлы
COPY go.mod go.sum ./
RUN go mod download
# Копируем source и build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp -ldflags="-w -s"
# Финальная версия
FROM alpine:3.18
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# Копируем только скомпилированный бинарник
COPY --from=builder /app/myapp .
# Ставим non-root пользователя
USER nobody
CMD ["./myapp"]
always
, как понятно из названия, срабатывает всегда, а failure
, только при сбое) получает данные из окружения текущего workflow и формирует текст сообщения, а затем отправляет его в Telegram-бота по API. import asyncio
import aiohttp
urls = [
'https://example.com/',
# ... список URLов
]
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
tasks.append(fetch(session, url))
pages = await asyncio.gather(*tasks)
for content in pages:
process(content)
def process(content):
# Логика разбора страницы
pass
if __name__ == '__main__':
asyncio.run(main())
def filter_dict(data: dict[int, int]) -> dict[int, int]:
for key in list(data.keys()):
if key % 2 == 0:
data[key + 1] = data.pop(key) * 2
return data
data = {1: 10, 2: 20, 3: 30, 4: 40}
result = filter_dict(data)
print(result)
data
с ключами и значениями типа int
.for key in list(data.keys())
проходит по всем ключам словаря.list(data.keys())
, чтобы создать список ключей, так как мы будем изменять сам словарь data
в процессе итерации. Если бы мы проходили по data.keys()
напрямую, это могло бы вызвать ошибки.key % 2 == 0
). Это условие выделяет чётные ключи.data.pop(key) * 2
) и присваивается новому ключу, который равен key + 1
.pop
удаляет старый ключ из словаря и возвращает его значение.data
, а результат работы функции выводится через print
.{1: 10, 3: 40, 5: 80}
{1: 10, 2: 20, 3: 30, 4: 40}
при прохождении через функцию:1
(нечётный). Условие key % 2 == 0
не выполняется, пропускаем этот ключ.2
(чётный).data.pop(2)
→ удаляем ключ 2
, возвращаем его значение 20
.2 + 1 = 3
. Присваиваем значение 20 * 2 = 40
новому ключу 3
. {1: 10, 3: 40, 4: 40}
.3
(нечётный). Условие key % 2 == 0
не выполняется, пропускаем.4
(чётный).data.pop(4)
→ удаляем ключ 4
, возвращаем его значение 40
.4 + 1 = 5
. Присваиваем значение 40 * 2 = 80
новому ключу 5
. {1: 10, 3: 40, 5: 80}
.{1: 10, 3: 40, 5: 80}
.list(data.keys())
), чтобы изменения в словаре data
не влияли на процесс итерации. Без этого подхода могли возникнуть ошибки или пропуск ключей.pop
удаляет чётные ключи и их значения из словаря. Удвоенное значение присваивается новому ключу (key + 1
). Это приводит к замене чётных ключей на нечётные с модифицированным значением.sestatus
sudo setenforce Permissive # или Enforcing
sudo audit2allow -a -M mypolicy
sudo semodule -i mypolicy.pp
def process_data(data: list[int]) -> list[int]:
def modify_and_filter():
for i in range(len(data)):
if data[i] % 2 == 0:
data.pop(i)
yield i
indices = list(modify_and_filter())
return indices + data
data_lst = [1, 2, 3, 4, 5, 6]
result = process_data(data_lst)
print(result)
data
и возвращающая обработанный результат.data
.data.pop(i)
).yield
).modify_and_filter
— это генератор, так как она использует yield
. Вызов этой функции не выполняет её код сразу, а создаёт генераторный объект, выполнение которого начинается только при итерации.0
до len(data) - 1
. Внутри цикла вызывается data[i]
для проверки условия.data
модифицируется. Это влияет на длину списка и смещение элементов, что приводит к несогласованности индексов.1
, то элемент с индексом 2
станет на место элемента 1
, а длина списка уменьшится.modify_and_filter
возвращает индексы удалённых элементов в процессе итерации.process_data
создаёт список из всех возвращённых генератором индексов (indices
) и объединяет его с текущим состоянием списка data
.IndexError
data_lst = [1, 2, 3, 4, 5, 6]
.process_data(data_lst)
запускает modify_and_filter
.i = 0
, проверяется data[0]
(значение 1
). Условие не выполнено, идёт следующая итерация.i = 1
, проверяется data[1]
(значение 2
). Условие выполнено:data[1]
(pop(1)
), список становится [1, 3, 4, 5, 6]
.i = 1
.data[2]
, но из-за удаления индексы изменились: на месте data[2]
сейчас стоит 4
, а длина списка уменьшилась. Попытка доступа к несуществующему индексу приводит к IndexError
.