При работе в Kivy с потоками (threading) вы должны иметь в виду, что все изменения в графическом интерфейсе должны делаться из главного потока. Да, и это не смотря даже на GIL! Дело в том, что контекст OpenGL очень не любит, когда его трогают из чужого потока, что приводит к случайным и иногда сложно уловимым визуальным глюкам (см. прикрепленное фото).
Как это сделать? Воспользоваться декоратором
Пример использования из Durak GUI. Метод
Как это сделать? Воспользоваться декоратором
mainthread, который поставит при вызове оригинальной функции поставит ее выполнение в следующий тик главного цикла приложения в главном потоке. Пример использования из Durak GUI. Метод
self.on_found_peer вызывается из другого вспомогательного потока, но он меняет интерфейс, поэтому должен быть снабжен декоратором mainthread:from kivy.clock import mainthread
class DurakFloatApp(App):
...
@mainthread
def on_found_peer(self, addr, peer_id):
print(f'Найден соперник {peer_id}@{addr}')
# делать что-то с GUI!
...
self.discovery = DiscoveryProtocol(self.my_pid, PORT_NO)
#
self.discovery.run_in_background(self.on_found_peer)GitHub
GitHub - tirinox/durakmq: LAN Durak Card Game
LAN Durak Card Game. Contribute to tirinox/durakmq development by creating an account on GitHub.
👍7
Forwarded from Kali Linux
☠️ Security Scripts
Набор скриптов для защиты и нападения для обучения изучающих информационную безопасность.
⚠️ Информация предоставлена исключительно с целью ознакомления. И побуждает обратить внимание на проблемы в безопасности.
#python #hack #pentest #redteam #blueteam
⚙️ GitHub
@linuxkalii
Набор скриптов для защиты и нападения для обучения изучающих информационную безопасность.
⚠️ Информация предоставлена исключительно с целью ознакомления. И побуждает обратить внимание на проблемы в безопасности.
#python #hack #pentest #redteam #blueteam
⚙️ GitHub
@linuxkalii
👍6
🚀 10 идиоматических приемов для эффективного программирования на Python
Программирование само по себе очень увлекательное занятие, а программирование на Python увлекательнее вдвойне, поскольку в данном языке существует много разных способов реализации одних и тех же функциональностей. Однако в большинстве случаев предпочтительно использовать реализации, присущие исключительно Python, характерной особенностью которых являются чистота и краткость кода.
Программирование на Python или любом другом языке — это не высшая математика, здесь многое зависит от степени сформированности ваших навыков. Если вы целенаправленно начнете писатькод в стиле Python (иначе говоря, питонический), то эти техники вскоре пополнят ваш набор инструментов, и постепенно их использование в проектах станет самым привычным делом. Рассмотрим ряд таких простых приемов, которые, я надеюсь, окажутся вам полезны.
Читать дальше
@pro_python_code
Программирование само по себе очень увлекательное занятие, а программирование на Python увлекательнее вдвойне, поскольку в данном языке существует много разных способов реализации одних и тех же функциональностей. Однако в большинстве случаев предпочтительно использовать реализации, присущие исключительно Python, характерной особенностью которых являются чистота и краткость кода.
Программирование на Python или любом другом языке — это не высшая математика, здесь многое зависит от степени сформированности ваших навыков. Если вы целенаправленно начнете писатькод в стиле Python (иначе говоря, питонический), то эти техники вскоре пополнят ваш набор инструментов, и постепенно их использование в проектах станет самым привычным делом. Рассмотрим ряд таких простых приемов, которые, я надеюсь, окажутся вам полезны.
Читать дальше
@pro_python_code
👍9
Enumerate
В традиционных языках программирования вам нужна переменная цикла для перебора различных значений контейнера. В Python это упростили: вы можете получить доступ к переменной цикла вместе со значением итерируемого объекта. Функция enumerate(x) возвращает две итерируемые переменные. Одна из них изменяется в диапазоне от 0 до len(x) - 1, а другая представляет собой элементы x.
В традиционных языках программирования вам нужна переменная цикла для перебора различных значений контейнера. В Python это упростили: вы можете получить доступ к переменной цикла вместе со значением итерируемого объекта. Функция enumerate(x) возвращает две итерируемые переменные. Одна из них изменяется в диапазоне от 0 до len(x) - 1, а другая представляет собой элементы x.
Для тех , кто ищет работу или фриланс на Python
@python_djangojobs - наш канал вакансий Python
@python_django_work - чат
@datascienceml_jobs вакансии Machine learning /Python
@Machinelearning_Jobs - чат
@hr_itwork - it вакансии
@python_djangojobs - наш канал вакансий Python
@python_django_work - чат
@datascienceml_jobs вакансии Machine learning /Python
@Machinelearning_Jobs - чат
@hr_itwork - it вакансии
👍8❤1
Разбор URL
Функция urlparse из модуля urllib.parse разбирает URL на составные части: протокол, имя хоста, порт, путь, запрос и прочие.
Имя хоста, порт, логин и пароль объединены в поле netloc, но их компоненты доступны для чтения по этим атрибутам:
Собрать обратно ParseResult в URL:
Если мы хотим в URL поменять какие-то части, удобно делать вот так:
Однако таким способом нельзя поменять компоненты netloc, например, отдельно порт. netloc нужно менять целиком:
Функция urlparse из модуля urllib.parse разбирает URL на составные части: протокол, имя хоста, порт, путь, запрос и прочие.
>>> u1 = urlparse('https://tirinox:1234@www.site.com:8080/some/page/index.html?page=2&action=login')
>>> u1
ParseResult(scheme='https', netloc='tirinox:1234@www.site.com:8080', path='/some/page/index.html', params='', query='page=2&action=login', fragment='')
>>> u1.scheme, u1.query, u1.netloc
('https', 'page=2&action=login', 'tirinox:1234@www.site.com:8080')Имя хоста, порт, логин и пароль объединены в поле netloc, но их компоненты доступны для чтения по этим атрибутам:
>>> u1.username, u1.password, u1.hostname, u1.port
('tirinox', '1234', 'www.site.com', 8080)Собрать обратно ParseResult в URL:
>>> u1.geturl()
'https://www.site.com:8080/some/page/index.html?page=2&action=login'Если мы хотим в URL поменять какие-то части, удобно делать вот так:
>>> u1._replace(scheme='http').geturl()
'http://www.site.com:8080/some/page/index.html?page=2&action=login'
Однако таким способом нельзя поменять компоненты netloc, например, отдельно порт. netloc нужно менять целиком:
>>> u1._replace(netloc="user:password@www.site.com:8090").geturl()
'https://user:password@www.site.com:8090/some/page/index.html?page=2&action=login'🔥8👍4
Needl – генератор случайного интернет-трафика
Позволяет скрыть ваш истинный трафик, что, по сути, делает ваши данные «иглой в стоге сена» и, следовательно, их труднее найти.
Цель проекта состоит в том, чтобы вашему интернет-провайдеру, правительству и т. д. было сложнее отслеживать вашу историю просмотров и привычки.
#GitHub | #Python #Privacy
@pro_python_code
Позволяет скрыть ваш истинный трафик, что, по сути, делает ваши данные «иглой в стоге сена» и, следовательно, их труднее найти.
Цель проекта состоит в том, чтобы вашему интернет-провайдеру, правительству и т. д. было сложнее отслеживать вашу историю просмотров и привычки.
#GitHub | #Python #Privacy
@pro_python_code
👍16🔥3❤1
🐍 Пишем свою «Матрицу» на Python
Изучать новое можно по-разному. Одним нравится сначала штудировать теорию, а потом применять её на практике. Другие предпочитают учиться исключительно на примерах, найденных на любимом Stackoverflow. А кто-то вообще загружает навыки управления вертолётом и технику боевых единоборств по выделенному каналу прямо в мозг.
В любом случае без практических упражнений не обойтись. После ускоренной загрузки знаний Нео всё равно должен пройти спарринг с Морфеусом, чтобы научиться применять терабайты загруженных навыков на практике. Только вот упражнения бывают разные. Одно дело — лихо взлететь под потолок и проломить балки восточного спортзала, и совсем другое — методично час за часом шлифовать своё мастерство.
Читать дальше
@pro_python_code
Изучать новое можно по-разному. Одним нравится сначала штудировать теорию, а потом применять её на практике. Другие предпочитают учиться исключительно на примерах, найденных на любимом Stackoverflow. А кто-то вообще загружает навыки управления вертолётом и технику боевых единоборств по выделенному каналу прямо в мозг.
В любом случае без практических упражнений не обойтись. После ускоренной загрузки знаний Нео всё равно должен пройти спарринг с Морфеусом, чтобы научиться применять терабайты загруженных навыков на практике. Только вот упражнения бывают разные. Одно дело — лихо взлететь под потолок и проломить балки восточного спортзала, и совсем другое — методично час за часом шлифовать своё мастерство.
Читать дальше
@pro_python_code
👍14
⚡️ Атрибуты функций
defaults — кортеж с значениями по умолчанию. code — да-да, вы правильно поняли, код функции.
globals — глобальные значения в модуле, где функция была определена.
И хочу напомнить про dict — переменную, которая позволяет добавлять свои атрибуты функции.
#теория
__name__ возвращает имя функции.name__ возвращ— полный путь к функции (ClassC.ClassD.function).ции. __qualn— модуль, в котором она находится.defaults — кортеж с значениями по умолчанию. code — да-да, вы правильно поняли, код функции.
globals — глобальные значения в модуле, где функция была определена.
И хочу напомнить про dict — переменную, которая позволяет добавлять свои атрибуты функции.
#теория
👍7
DALL·E Flow — это модель, позволяющая создавать изображений высокой четкости из текста.
Github https://github.com/jina-ai/dalle-flow
Colab: https://colab.research.google.com/github/jina-ai/dalle-flow/blob/main/client.ipynb
@pro_python_code
Github https://github.com/jina-ai/dalle-flow
Colab: https://colab.research.google.com/github/jina-ai/dalle-flow/blob/main/client.ipynb
@pro_python_code
👍7
🚀 @machinelearning_interview - здесь, где мы собираем все возможные вопросы и ответы с собеседований по Машинному обучению, нейронным сетям и Глубокому обучению. Для всех уровней разработчиков. Желающие помочь, могут присылать вопросы, с которыми они сталкивались на собеседованиях.
Посмотреть
Посмотреть
🔥4
🐍📚 Создаем аналог LiveLib.ru на Flask. Часть 2: CRUD, IntegrityError и валидация WTForms
Читать
1 часть
@pro_python_code
Читать
1 часть
@pro_python_code
Библиотека программиста
🐍📚 Создаем аналог LiveLib.ru на Flask. Часть 2: CRUD, IntegrityError и валидация WTForms
В заключительной части: реализуем набор операций для создания, редактирования и удаления записей; обеспечиваем автоматическое сжатие загружаемых обложек до нужного размера с помощью Pillow.
👍8👎1
⚡️ Профилируем код
Не можете найти слабое место у вашего алгоритма (не можете, поскольку его нет 😎 )? Давайте тогда посмотрим на использование ресурсов с помощью scalene.
Установка:
#миниурок #scalene
Не можете найти слабое место у вашего алгоритма (
Установка:
pip install scalene
Вам не нужно ничего добавлять в код, просто пишете scalene file.py и получаете вывод, как на фото выше. Преимущества и сравнение можно найти тут.#миниурок #scalene
👍8
globals(), locals(), vars(), dir()
Программист на Python может узнать, какие именно переменные определенны в данный момент в интерпретаторе. Переменные можно разделить на локальные и глобальные. Глобальные определены на верхнем уровне кода снаружи функций и классов (грубо говоря без отступов слева). Локальные переменные наоборот определены внутри своих зон видимости, ограниченных классами и функциями.
Функция globals() выдает словарь глобальных переменных (ключ – имя переменной). Функция locals() возвращает словарь только локальных переменных. Пример:
Обратите внимание, что переменная y в locals() имеет другое значение, нежели чем в globals(). Это две разные переменные из разных областей, но внутри функции приоритет имеет локальная y.
Еще важно знать, что в список переменных входят не только простые переменные, которые вы определяете через знак присваивания, но и функции, классы и импортированные модули!
Через словари из locals() и globals() переменные можно не только читать, но и создавать, перезаписывать и удалять:
Функция vars() ведет себя как locals(), если вызвана без аргумента, а если с аргументом, то она просто получает
В глобальном контексте все три функции возвращают одно и тоже – глобальные переменные. Проверьте:
Функциия dir(), будучи вызвана без параметра, возвращает список имен переменных. Глобальных или локальных в зависимости от места вызова:
Все рассмотренные выше функции являются встроенными и не требуют импортов.
@pro_python_code
Программист на Python может узнать, какие именно переменные определенны в данный момент в интерпретаторе. Переменные можно разделить на локальные и глобальные. Глобальные определены на верхнем уровне кода снаружи функций и классов (грубо говоря без отступов слева). Локальные переменные наоборот определены внутри своих зон видимости, ограниченных классами и функциями.
Функция globals() выдает словарь глобальных переменных (ключ – имя переменной). Функция locals() возвращает словарь только локальных переменных. Пример:
x, y = 5, 10
def test():
y, z = 33, 44
print('globals:', globals())
print('locals:', locals())
test()
"""Вывод:
globals: {'__name__': '__main__', ... '__file__': '/Users/.../vars.py', '__cached__': None, 'x': 5, 'y': 10, 'test': <function test at 0x107677280>}
locals: {'y': 33, 'z': 44}"""Обратите внимание, что переменная y в locals() имеет другое значение, нежели чем в globals(). Это две разные переменные из разных областей, но внутри функции приоритет имеет локальная y.
Еще важно знать, что в список переменных входят не только простые переменные, которые вы определяете через знак присваивания, но и функции, классы и импортированные модули!
Через словари из locals() и globals() переменные можно не только читать, но и создавать, перезаписывать и удалять:
>>> x = 10
>>> globals()['x'] = 5
>>> x
5
>>> globals()['new_var'] = 10
>>> new_var
10
>>> del globals()['new_var']
>>> new_var
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'new_var' is not definedФункция vars() ведет себя как locals(), если вызвана без аргумента, а если с аргументом, то она просто получает
_ _ dict _ _ от аргумента. Если его нет у аргумента, то будет TypeError.class Foo:
def __init__(self):
self.x = 5
f = Foo()
print(vars(f)) # {'x': 5}
print(vars(f) == f.__dict__) # TrueВ глобальном контексте все три функции возвращают одно и тоже – глобальные переменные. Проверьте:
print(globals())
print(locals())
print(vars())
print(globals() == locals() == vars()) # TrueФункциия dir(), будучи вызвана без параметра, возвращает список имен переменных. Глобальных или локальных в зависимости от места вызова:
def test():
x = 10
print(dir()) # ['x']
y = 10
test()
print(dir()) # ['__annotations__', ..., '__spec__', 'test', 'y']Все рассмотренные выше функции являются встроенными и не требуют импортов.
@pro_python_code
👍13❤2
Каким будет результат выполнения кода?
Anonymous Quiz
34%
1
3%
21
2%
12
24%
2
6%
None
11%
Error
20%
Узнать ответ
👍14🤯2😁1
jgram – Библиотека для написания телеграм ботов, что позволяет описывать их структуру в json файлах
Призвана ускорить написание ботов, и сделать их структуру более гибкой и понятной
Библиотека построена на базе aiogram2.21
@pro_python_code | #Interesting #Python #Telegram #Bot
Призвана ускорить написание ботов, и сделать их структуру более гибкой и понятной
Библиотека построена на базе aiogram2.21
⚙ Github@pro_python_code | #Interesting #Python #Telegram #Bot
👍14