headers = {'user-agent': 'my-app/0.0.1', 'token': 'Токен есть если что'}
for lines in lines:
for line in lines:
…json = {"content": line}
Что делает единичная звездочка в аргументах метода Python?
namedtuple(
typename,
field_names,
*,
rename=False,
defaults=None,
module=None,
)
Ни разу не встречал такое раньше, в документации тоже не смог откопать
def join_numbers_from_range(start, finish):
result = ""
i = 1
while i <= finish:
result += str(i)
i = i + 1
return result
print(join_numbers_from_range(start=5, finish=7))
class Parent:
known_children = [] # список классов-потомков Parent
@staticmethod
def register(klass): # декоратор для регистрации классов-потомков
Parent.known_children.append(klass)
return klass
@classmethod
def can_handle(cls, data): # "эй, потомок, ты можешь себя создать из этих данных?"
raise NotImplementedError()
@staticmethod
def make(data): # создаёт экземпляр одного из потомков
for child in Parent.known_children:
if child.can_handle(data): # потомок согласился обработать данные?
return child(data) # вызываем конструктор класса-потомка
else: # относится к for ... in !
raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
# тут остальная начинка класса
...
# а это пример потомка
@Parent.register # явная регистрация потомка через декоратор
# так удобнее, потому что так можно создавать промежуточных потомков,
# которые не будут реально использоваться - только в наследовании
class SomeChild(Parent):
@classmethod
def can_handle(cls, data):
return data.get('name', None) == 'SomeChild' # критерий для определения - наш случай или нет?
def __init__(self, data):
self.x = data['x']
self.y = data['y']
c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69}) # создаст экземпляр SomeChild
print(c)
try:
Parent.make({'name': 'invalid'}) # потерпит неудачу
except TypeError as err:
print(err)
subprocess.Popen
, os.system
, os.spawn
, os.startfile
, os.exec
, os.fork
и так далее. import sys
import traceback
# хук который ловит событие импорта модуля
def hook(event, args):
if event != 'import':
return
name, filename = args[0], args[1]
callstack = traceback.extract_stack(limit=None)
print(event, name, filename)
for item in traceback.format_list(callstack):
print(' ', item.strip())
sys.addaudithook(hook)
import json
print('Done')
df[df['comment_text'].str.contains(r'[^\w\s,]', regex=True)]
Для моего примера работает, сработает ли в целом неизвестно. для ARJ- и ZIP-документов перебор ключей ведётся по содержимому, и, если сохранился исходник хотя бы одного документа, пароль будет найден в течение нескольких часов независимо от его длины и сложности;
server.voice.channels
- получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.class Person:
def __init__(self, name: str):
self._name: str = ''
self.name = name
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str) -> None:
if not value:
raise ValueError('Must not be empty')
self._name = value
from typing import TypeVar, Type, Any, Annotated, Callable, Dict, get_args, get_origin
T = TypeVar('T')
ValidationRule = Callable[[Any], bool]
ValidationRules = Dict[str, ValidationRule]
class ValidatedProperty:
"""Экземпляры этого класса будут свойствами в валидируемых классах, и будут заниматься валидацией."""
def __init__(self, name: str, storagename: str, rules: ValidationRules):
self.name = name # как называется свойство
self.storagename = storagename # где его хранить
self.rules = rules # какие правила применять
def __get__(self, instance, owner=None):
return getattr(instance, self.storagename) # при чтении просто возвращаем свойство
def __set__(self, instance, value): # при записи валидируем
for message, rule in self.rules.items():
if not rule(value): # если правило нарушено, выкидываем исключение с сообщением
raise ValueError(f'{instance.__class__.__name__}.{self.name}: {message}')
setattr(instance, self.storagename, value)
def validated(klass: Type[T]) -> Type[T]:
"""Декоратор для валидируемых классов."""
for name, annot in klass.__annotations__.items(): # проверяем список аннотаций в классе
base = get_origin(annot) or annot
if base is not Annotated: # нас интересуют только те, которые помечены как Annotated
continue
args = get_args(annot)
rules = [arg for arg in args if isinstance(arg, dict)]
if not rules: # и только если один (любой) из аргументов Annotated - словарь
continue
# в этом случае мы считаем, что словарь содержит правила валидации, и создаём свойство класса
setattr(klass, name, ValidatedProperty(name, f'_{name}', rules[0]))
return klass # не забываем вернуть изменённый класс!
@validated
class Person:
name: Annotated[str, {'must not be empty': lambda v: bool(v)}]
age: Annotated[int, {'must be positive': lambda v: v > 0}]
def __init__(self, name: str, age: int):
self.name = name # валидация отработает уже здесь
self.age = age # валидация отработает уже здесь
def __repr__(self) -> str:
return f'Person(name={self.name!r}, age={self.age!r})'
try:
Person('John Doe', 23) # отработает успешно
except Exception as err:
print('Failed to create person 1')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 1 created')
try:
Person('', 23) # выкинет исключение
except Exception as err:
print('Failed to create person 2')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 2 created')
try:
Person('Jane Doe', -23) # выкинет исключение
except Exception as err:
print('Failed to create person 3')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 3 created')
p = Person('John Doe', 23)
try:
p.name = '' # выкинет исключение
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
try:
p.age = 0 # выкинет исключение
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
try:
p.age = 24 # отработает успешно
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
print(p)
print(vars(p))