LINUX.ORG.RU

365
Всего сообщений: 3800

Декорирование блоков в CPython

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

Как вы декорируете блоки кода в Python? Ну то есть все мы знаем, что можно декорировать функцию:

@decorator
def funcname(arg):
    pass

и даже декорировать класс:

@decorator
class classname:
    def __init__(self):
        pass

Но вот беда — как передать кусок кода в другую функцию? Вечная проблема лямбды в питоне, которая не решена до сих пор и никогда не будет решена:

>>> decorator(lambda: a = 2)
  File "<stdin>", line 1
SyntaxError: lambda cannot contain assignment

Мне стыдно, но я до сих пор не подозревал, что в лямбдах нельзя использовать присваивание. Я подозреваю, что я не один такой, на самом деле, потому что лямбды почти никто не использует — в том числе по этой причине.

«Хорошо, наш язык говно, но давайте не отчаиваться, с этим что-то можно сделать» — сказал когда-то Гвидо, и предложил:
https://www.python.org/dev/peps/pep-0343/ — PEP 343 — The «with» Statement

Этот чудесный костыль позволяет вам обрамить любой блок кода процедурами инициализации и финализации. Проблема — что мне делать, если я хочу обрамить блок кода сложнее, например, чтобы он оказался в цикле? То есть

for filename in filenames:
   with try_infinitely():
      print(open(filename, 'r').readlines())

В данном случае код должен пытаться бесконечно открывать и читать файл, пока не сможет это сделать. На питоне это можно написать как:

for filename in filenames:
    while True:
        try:
            print(open(filename, 'r').readlines())
        except Exception as e:
            print(e)
        else:
            break;

Но писать такую стенку каждый раз весьма утомительно. Как и заставлять юзверя объявлять вложенную функцию и передавать ее функции-декоратору, поскольку это будет нарушать обычную читаемость кода из-за того, что код вложенной функции будет выполняться позже своего объявления, в отличие от тех же лямбд JS, которые выполняются там, где определены. Чтобы была чуть более очевидна блевотность такого кода, я специально добавил цикл for filename in filenames снаружи:

for filename in filenames:
    @try_infinitely
    def nestedfunc():
        print(open(filename, 'r').readlines())
    nestedfunc()

или

@try_infinitely
def nestedfunc():
    print(open(filename, 'r').readlines())
for filename in filenames:
    nestedfunc()

Последнее, к моему удивлению, работает, потому что области видимости в питоне поделены на уровне функций, а не блоков, и потому filename будет видима в любом месте функции.

А хотелось бы чего-то простого и понятного, плана:

for filename in filenames:
    @try_infinitely:
        print(open(filename, 'r').readlines())

Чувствуете, как код сразу стал намного проще? Единственный выход, который я пока что вижу — это городить свой DSL через

source = inspect.get_source(func)
ast.parse(source, func.__code__.co_filename, 'exec')

К сожалению, питон из коробки не позволяет кормить AST декоратору, а сам AST он нигде не хранит, потому остается только парсить сырцы.

 , , ,

byko3y ()

Помогите разработать структуру Django проекта

Делаю сайт разделённый на три раздела в каждом будет статьи и блоги в них будут категории, разные у каждого из разделов. В этих разделах будут ещё разные сервисы и подразделы. Помогите удобно структурировать проект. Основа-Django 3

 , ,

sadosadoushko ()

Проблемы при компиляции python в apk через buildozer (kivy->buildozer)

(Пробовал в: kali, ubuntu, xubuntu, garuda(arch)) При попытке компиляции python кода в apk, вылетает ошибка.

[ERROR]: Build failed: The minimum supported NDK version is 19. You can download it from https://developer.android.com/ndk/downloads/.
[INFO]: Instructions: Please, go to the android NDK page (https://developer.android.com/ndk/downloads/) and download a supported version.
*** The currently recommended NDK version is 19c ***
# Command failed: /usr/bin/python3 -m pythonforandroid.toolchain create --dist_name=kivymd_test --bootstrap=sdl2 --requirements=python3,kivy==1.11.1,kivymd --arch armeabi-v7a --copy-libs --color=always --storage-dir="/home/longinus/Desktop/Test/TestKivyMD/.buildozer/android/platform/build-armeabi-v7a" --ndk-api=21 --ignore-setup-py
# ENVIRONMENT:
# SHELL = '/bin/bash'
# SESSION_MANAGER = 'local/longinus:@/tmp/.ICE-unix/1774,unix/longinus:/tmp/.ICE-unix/1774'
# QT_ACCESSIBILITY = '1'
# COLORTERM = 'truecolor'
# XDG_CONFIG_DIRS = '/etc/xdg/xdg-ubuntu:/etc/xdg'
# XDG_MENU_PREFIX = 'gnome-'
# GNOME_DESKTOP_SESSION_ID = 'this-is-deprecated'
# LC_ADDRESS = 'uk_UA.UTF-8'
# GNOME_SHELL_SESSION_MODE = 'ubuntu'
# LC_NAME = 'uk_UA.UTF-8'
# SSH_AUTH_SOCK = '/run/user/1000/keyring/ssh'
# XMODIFIERS = '@im=ibus'
# DESKTOP_SESSION = 'ubuntu'
# LC_MONETARY = 'uk_UA.UTF-8'
# SSH_AGENT_PID = '1739'
# GTK_MODULES = 'gail:atk-bridge'
# PWD = '/home/longinus/Desktop/Test/TestKivyMD'
# LOGNAME = 'longinus'
# XDG_SESSION_DESKTOP = 'ubuntu'
# XDG_SESSION_TYPE = 'x11'
# GPG_AGENT_INFO = '/run/user/1000/gnupg/S.gpg-agent:0:1'
# XAUTHORITY = '/run/user/1000/gdm/Xauthority'
# WINDOWPATH = '2'
# HOME = '/home/longinus'
# USERNAME = 'longinus'
# IM_CONFIG_PHASE = '1'
# LC_PAPER = 'uk_UA.UTF-8'
# LANG = 'en_US.UTF-8'
# LS_COLORS = 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
# XDG_CURRENT_DESKTOP = 'ubuntu:GNOME'
# VTE_VERSION = '6003'
# GNOME_TERMINAL_SCREEN = '/org/gnome/Terminal/screen/83a25a42_f975_4528_a1de_58d61ea48c53'
# INVOCATION_ID = '95a199a49b304bb8a4483db26e6a99a9'
# MANAGERPID = '1554'
# LESSCLOSE = '/usr/bin/lesspipe %s %s'
# XDG_SESSION_CLASS = 'user'
# TERM = 'xterm-256color'
# LC_IDENTIFICATION = 'uk_UA.UTF-8'
# LESSOPEN = '| /usr/bin/lesspipe %s'
# USER = 'longinus'
# GNOME_TERMINAL_SERVICE = ':1.142'
# DISPLAY = ':1'
# SHLVL = '1'
# LC_TELEPHONE = 'uk_UA.UTF-8'
# QT_IM_MODULE = 'ibus'
# LC_MEASUREMENT = 'uk_UA.UTF-8'
# XDG_RUNTIME_DIR = '/run/user/1000'
# LC_TIME = 'uk_UA.UTF-8'
# JOURNAL_STREAM = '8:47181'
# XDG_DATA_DIRS = '/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop'
# PATH = '/home/longinus/.buildozer/android/platform/apache-ant-1.9.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
# GDMSESSION = 'ubuntu'
# DBUS_SESSION_BUS_ADDRESS = 'unix:path=/run/user/1000/bus'
# LC_NUMERIC = 'uk_UA.UTF-8'
# OLDPWD = '/opt'
# _ = '/usr/local/bin/buildozer'
# PACKAGES_PATH = '/home/longinus/.buildozer/android/packages'
# ANDROIDSDK = '/home/longinus/.buildozer/android/platform/android-sdk'
# ANDROIDNDK = '/home/longinus/.buildozer/android/platform/android-ndk-r17c'
# ANDROIDAPI = '28'
# ANDROIDMINAPI = '21'
#
# Buildozer failed to execute the last command
# The error might be hidden in the log above this error
# Please read the full log, and search for it before
# raising an issue with buildozer itself.
# In case of a bug report, please add a full log with log_level = 2 

 , , , ,

YaEstNoob ()

Вакансия Senior Python Developer в компанию Тензор

Мы разрабатываем программное обеспечение, чтобы и малые предприятия, и крупные корпорации могли с комфортом весит и развивать свой бизнес. Главный продукт - программа СБИС - коммуникации, учет и управление в одной системе.

Контакты: 89159614437 телега, aa.kuleshova@tensor.ru
ЗП от 180 тыс.руб

В НАШИХ ПРОЕКТАХ ВАМ ПРЕДСТОИТ:

  • работать в большой команде как локальных, так и распределенных разработчиков;
  • разрабатывать один из модулей системы управления предприятием;
  • участвовать в процессе проектирования;
  • поддерживать существующую кодовую базу.

МЫ ЖДЕМ ОТ ВАС:

  • опыт разработки от 3 лет;
  • хорошее знание SQL(PostgreSQL);
  • знание основных паттернов проектирования;
  • понимание принципов работы web вообще в web-приложений в частности;
  • умение пользоваться GIT;
  • умение писать структурированный и рабочий код;
  • толерантность к чужому коду, умение разбираться в нем и править без полной переделки;
  • способность самостоятельно ставить задачи группе программистов.

ТАКЖЕ ПРИВЕТСТВУЮТСЯ:

  • если вы разбираетесь в javascript коде;
  • понимаете принципы работы RabbitMQ и Redis.

МЫ ПРЕДЛАГАЕМ:

  • заработную плату в зависимости от квалификации и уровня ответственности;
  • оформление по ТК РФ;
  • премии от 5 до 20% по итогам работы за месяц;
  • помощь опытного наставника на испытательный срок;
  • гибкое начало и окончание рабочего дня;
  • оборудованное место в комфортном офисе или возможность работать из дома в любимых тапочках;
  • корпоративные скидки и бонусы от наших партнеров (обучающие курсы, товары и т.д.);
  • компенсация спортивных абонементов, ДМС;
  • подарки от компании при заключении брака и рождении детей;
  • социальную поддержку при сложных жизненных ситуациях;
  • корпоративную библиотеку;
  • корпоративные праздники и различные совместные мероприятия.

 , ,

Lazypimple ()

В скрипте функции выполняются не по очереди, а вразнобой.

Функции в скрипте python выполняются в произвольном порядке. Я ожидаю, что функции выполняются друг за другом. Сам скрипт - это набор функций.

Вся логика находится в файле ‘init.py’(знаки подчеркивания в начале и конце имени файла режет парсер сайта).

Среди них две функции(модули piper и build_apps) запускают многопоточную сборку друг за другом, может из-за этого проблемы.

Исходный код - GitHub.

Ожидаемый лог:

  • Engine *.mmp done!(собираются статические библиотеки)
  • Target ScummVM?.mmp done!(собираются exe)
  • pkg: *.pkg(собираются установочные файлы)

Лог сборки:

Queue size: 92  
Thread count: 6
Queue size: 8
Thread count: 6
pkg: Neverhood.pkg
pkg: Neverhood_cmdline.pkg
Target ScummVM5.mmp done!
Target Neverhoode.mmp done!
 Target ScummVM1.mmp done!
Engine access.mmp done!
Engine adl.mmp done!Engine agi.mmp done!

Engine avalanche.mmp done!
Target ScummVM6.mmp done!
Target ScummVM2.mmp done!
Target ScummVM3.mmp done!
Engine buried.mmp done!
Target ScummVM7.mmp done!
Engine asylum.mmp done!
Target ScummVM4.mmp done!
Engine cge.mmp done!
Engine cge2.mmp done!
Engine chewy.mmp done!
Engine composer.mmp done!
Engine cine.mmp done!
Engine cryo.mmp done!
Далее много «Engine *.mmp done!»

Чяднт? P.S. Python 2.

 ,

zanac1 ()

Что посоветуете почитать по Python, чтобы подтянуть теорию?

Сабж
Нужно именно как и почему оно работает, чем отличается <похожаяфича_нейм_1> от <похожаяфича_нейм_2>, немного про внутреннее устройство и подобное.

 ,

Qwentor ()

рассмотрю предложения: node, python, express, flask, mongo, redis, react, pwa etc

всем привет

инженер-разработчик, например, middle, возьмусь за ваши горящие задачи, помогу с беком, фронтом, архитектурой

монга-nosql, событийная архитектура, микросервисы, высокая нагрузка

pwa, одностраничные сайты-приложения, сложные интерфейсы

помогу разобраться, решу проблемы, готов на овертайм

интересуют конкретные задачи от непосредственных участников: хрюшей и всевозможных менеджеров а также носителей гениальных идей на перспективу попрошу не беспокоить

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

пишите, пообщаемся: https://t.me/trashymichael

 , , , ,

trashymichael ()

scapy не работает

Драсте, пишу я вот такой код на scapy, на питоне:

arp_request = scapy.ARP(pdst=ip)
broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
arp_request_broadcast = arp_request/broadcast
answered = scapy.srp(arp_request_broadcast, timeout=1)[0]
print("-------------------------------------------------------")
for elements in answered:
    print(elements)
    print("-------------------------------------------------------")
у ip у меня значение '192.168.0.0/24'

Итог: после запуска пишет «Begin emission: » и ничего не выдаёт, только ломает интернет и приходится переподключаться к нему. Мне советовали сделать так:

pip uninstall scapy
pip install scapy==2.4.0
pip3 install scapy==2.4.0
Но в итоге питон даже не видит команд scapy и выдёт что-то типа 'Команды «scapy.ARP» не существует'

 , ,

nin922 ()

shared object

Ситуация такая, что settings не мутабельный. Писать в него не получается. Использовать redis или memcache - не получается. uid у инстансов динамический, поэтому использование uid_some_key проблематично, т.к при следующем старте инстанса uid будет уже другой. Надо как-то потом вычищать старые ключи и тд. Хотелось бы заюзать какой-то shared object, в который можно было бы писать полноценные list, dict, int/float, чтобы в этот shared object можно было читать/писать в течении всей жизни инстанса, после того, как инстанс перезапускается - эти данные очищались. Есть еще вариант писать в sqlite/pickle, но не хочется дергать постоянно диск. Что можно применить под эти нужды?

 , , ,

serg002 ()

Установка Sree

Доброго дня!

Установил Sree https://github.com/cannium/Sree ui к rados gw для ceph.

При переходе на вкладку в веб-морде Buckets выдает ошибку и не отображает список buckets и создать нельзя:

ERROR in app: Exception on /getservice [POST]
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python2.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "app.py", line 120, in listbucketsurl
    r = requests.get(url, headers=headers)
  File "/usr/lib/python2.7/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 508, in send
    raise ConnectionError(e, request=request)
ConnectionError: HTTPConnectionPool(host='192.168.1.5', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x463d82be2450>: Failed to establish a new connection: [Errno 111] Connection refused',))

Кто-нибудь сталкивался с этой печалькой?

Заранее спасибо!

 , ,

troy856 ()

разработка программы по удалению фона с изображения

Есть графический редактор. К нему хотим прикрутить удаление фона для фотографий и иллюстраций.

В вебе есть уже готовые библиотеки типа https://github.com/xuebinqin/U-2-Net на питоне. Есть такая https://github.com/cyrildiagne/ar-cutpaste

Мы тестили https://www.experte.com/background-remover который вроде использует одну из библиотек выше , но качество получается не очень.

Хотим ориентироваться на remove.bg сервис по качеству. У них всё в порядке.

Нужен человек для подбора архитектуры программы с вариантом обучения модели. Рассмотрю разработку на базе готовой библиотеки или с нуля.

 

ivancre ()

Установка cx_Oracle на Solaris 10

Необходимо запустить скрипт, написанный на Python 2.5, который работает с базой Oracle. Клиент Oracle уже стоит на машине, версии 10g.

И коробки на машине стоял Python 2.4.6, отдельно для запуска скрипта собрал python 2.5.5 по инструкции: https://community.oracle.com/tech/apps-infra/discussion/4277048/python3-installation-in-solaris-10

После сборки при запуске скрипта получаю ошибку: import cx_Oracle ImportError: No module named cx_Oracle

Пробовал собрать исходники с сайта PyPl, но не получилось.

Подскажите кто знает или у кого есть пакет cx_Oracle? Или подскажите если кто собирал данный модуль под Solaris как правильно это делать?

Потому как в официальной документации нет мануала для сборки под Solaris: https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html

 ,

Rino256 ()

Django как воспользоваться результатом c метода?



        Priv = 2020
        Now = 2021
        Next = 2022
     
        Rok = (
        (None, "Nie wybran"),
        (Priv, '2020'),
        (Now, '2021'),
        (Next, '2022')
        )
     
        Rok = models.IntegerField(choices=Rok, default=Now)
     
        def checkRok(self):
     
            strrok = str(self.Rok)
     
            return strrok

     
     
     
        Tydzien = models.DateField(datetime.date(year=checkRok, month=11, week=1))

Я хочу в последней строке использовать strrok как значение года. Подскажите пожалуйста как это сделать??
Почти все пока делаю в models и не хочу задействовать киких то вью или форм.. Заранее благодарю!

 ,

katemisik ()

Сложить несколько массивов всеми возможными комбинациями

Есть несколько неравных линейных массивов a, b, c, d…. Нужно посчитать суммы всех возможных комбинаций их элементов. Как их комбинировать? Очевидное решение, очевидно, и самое медленное:

sum_array = np.zeros( (len(a), len(b), ...) )
for i in range(len(a)):
    for j in range(len(b)):
.......
            sum_array[i, j, ...] = a[i] + b[j] + ...

Есть ли в numpy средства для такого суммирования?

 ,

question4 ()

Зависает Python скрипт. Как к нему подключиться и узнать где он завис?

На проде зависает Python скрипт. Можно ли подключиться непосредственно к зависшему скрипту и узнать на какой строке он завис?

 

sniper21 ()

Sphere через whonix

Здравствуйте!

Недавно начал знакомство с такими ОС как tails и whonix, но к сожалению совсем не знаком с линуксом и его терминалом.

  1. Кое-как запустил браузер sphere на вониксе(cd путь к папке; ./RunSphere.sh), однако столкнулся с тем, что после перезапуска, все настройки профиля сбрасываются. Почему это происходит и есть ли какое нибудь практичное решение?

  2. Хочу установить софт для телеграмм с гитхаба, делаю все по инструкции, однако при установке вылезает непонятная ошибка. Гуглить пытался, но так и не понял как решить проблему. https://skr.sh/s8RpmtWMwIc

 ,

HolyMolyy ()

Сортировка JSON 18+

Есть JSON-файл file1 с таким содержимым:

{
  "girls": {
    "0": {"name": "Маша", "position": 555},
    "1": {"name": "Анка", "position": 777},
    "2": {"name": "Ната", "position": 888}
  }
}
Подскажите как отсортировать girls по значению name и установить их position равным позиции в безымянном отсортированном списке (+1?) ?
Должно получится:
{
  "girls": {
    "0": {"name": "Анка", "position": 1},
    "1": {"name": "Маша", "position": 2},
    "2": {"name": "Ната", "position": 3}
  }
}
В man jq глядел и не понял.
Поделитесь правильными примерами на скриптовых языках, кто умеет.

 , , , ,

superuser ()

Conditional lookahead regex in python

Допустим есть такая регулярка на PHP:

^\+61(?(?=1800)1800\d{6}|\d{9})$

на странице видно, что из 4-х номеров она матчит только первые 2

+611800123456  # match
+61123456789   # match

+61180012345
+6112345678

В python такой синтаксис не поддерживается, указано, что группа должна быть именованная, чтобы на неё сослаться, т.е. как-то так, как я понимаю:

^\+61(?P<test>1800)?(?(test)\d{6}|\d{9})$

но проблема в том, что в этом варианте матчится и третий номер, хотя не должен.

Собственно вопрос, как исправить?

 , ,

conformist ()

Как правильно объявить тип данных list(dict(k1: str, k2: int))?

Есть функция, которая принимает аргумент в виде списка словарей. Что-то на подобие:

def aaa(some: list(dict(k1: str, k2: int))):
    pass

Смотрю https://docs.python.org/3/library/typing.html#typing.NewType

Но не могу понять, как сделать list(TypedDict)

 ,

serg002 ()

Как математически разбить диапазон hex?

print(hex2part(num=1, part=3))

out:

[['0x0', '0x4'], ['0x5', '0x9'], ['0xa', '0xe']]

Сейчас это работает, но я применил range диапазона. Как можно догадаться, чем больше num, тем медленней это делается

print(hex2part(num=7, part=3))

out:

time ./test.py
[['0x0', '0x5555554'], ['0x5555555', '0xaaaaaa9'], ['0xaaaaaaa', '0xffffffe']]

real    0m9.491s
user    0m7.010s
sys     0m2.479s

Как бы всё это сделать на уровне математики, чтобы не прибегать к использованию range?

 , ,

serg002 ()