from pathlib import Path
from sys import argv
script_dir = Path(argv[0]).parent.resolve() # путь к каталогу скрипта
db_path = script_dir / 'basa' / 'users.db' # путь к файлу в подкаталоге
Логи!A:F
, и перебирать его строки. Тогда и индекс считать не потребуется, у тебя в текущей строке будет информация по одному и тому же юзеру. Проверяешь нулевой элемент строки на нужное имя, если совпало - вытаскиваешь из последующих элементов нужную информацию. Why does on_message make my commands stop working?
Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message.
await bot.send_message(...)
.async def bot_startup(dp: Dispatcher):
asyncio.create_task(background_func())
.data = message.text.strip()
cur.execute(f"INSERT INTO {tableName} ({column_name}) VALUES ('{data}')")
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))
await iface.call_method('bla')
. Ты уверен, что обновление свойства произойдёт после завершения await? Если оно произойдёт до, то твой вызов wait_property() не увидит обновлений. Возможно, стоит вешать callback до вызова call_method()? import typing as tp
class Test:
@tp.overload
def __init__(self, x: int, y: str):
... # тут не должно быть тела!
@tp.overload
def __init__(self, other: 'Test'):
... # typehint в виде строки, так как класс Test еще не создан. Тела нет!
def __init__(self, *args, **kwargs): # настоящий конструктор
# определяем, как нас вызвали
if 'other' in kwargs:
first_arg = kwargs['other']
x, y = first_arg.x, first_arg.y
elif 'x' in kwargs:
x, y = kwargs.get('x'), kwargs.get('y')
elif isinstance(args[0], Test):
x, y = args[0].x, args[0].y
else:
x, y = args[0:2]
self.x: int = x
self.y: str = y
def __repr__(self) -> str:
return f'Test(x={self.x!r}, y={self.y!r})'
# порядковая передача аргументов сработает
t1 = Test(1, 'foo')
t2 = Test(t1)
print(t1, t2)
# именованная передача аргументов сработает
t3 = Test(x=2, y='bar')
t4 = Test(other=t3)
print(t3, t4)
Test(3, y='baz') # а вот это сломается...
worker = Worker()
await worker.run()
TelegramClient('anon', api_id, api_hash, proxy=("socks5", '127.0.0.1', 4444))
proxy=('http', 'proxy.server',3128)
if ai.SeparateByName(ai.text) is True:
response = f'my name {ai.name}'
ai.TextToSpeech(response)