import pathlib # стандартный модуль питона. Очень советую его освоить!
import sys
# путь к папке скрипта, например, C:\myscript
script_dir = pathlib.Path(sys.argv[0]).parent
# путь к файлу собирается из частей вот так
user_file = script_dir / "some_folder" / "user_file" # C:\myscript\some_folder\user_file
# обрати внимание, мы не паримся по поводу того, что
# под виндой разделитель каталогов \, а под линуксом /
# это уже забота pathlib
with user_file.open('w+') as f:
pass # делаешь что тебе нужно с файлом
# через функцию open() тоже сработает, метод open() просто для удобства
with open(user_file, 'w+') as f:
pass # делаешь что тебе нужно с файлом
GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)
извлечёт из строки нужные части. Их можно будет вытащить так:regexp = re.compile(r'GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)', re.I)
m = regexp.match('GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)')
if m:
print(m.group('days'), m.group('from'), m.group('to'))
now = datetime.datetime.now()
weekday = now.weekday()
days = m.group('days').lower()
days_of_week = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] # datetime.datetime.weekday()
if '-' in days: # диапазон
dfrom, _, dto = days.partition('-')
dfrom, dto = days_of_week.index(dfrom), days_of_week.index(dto)
if dfrom <= dto: # обычный кейс, вроде mon-fri
day_is_good = dfrom <= weekday <= dto
else: # на случае если нужно зацикливание вида fri-tue
day_is_good = (weekday >= dfrom) or (weekday <= dto)
else: # один день, не диапазон
dow = days_of_week.index(days)
day_is_good = weekday == dow
print(day_is_good) # True или False
datetime.datetime.now().replace(hour=h, minute=m)
и получаешь указанное время в текущий день.if from <= now <= to:
async def choice_cat(message):
CATs = cur.execute(f'SELECT name FROM cathlete WHERE id = "{message.from_user.id}"').fetchall()
for fds in range(len(CATs)):
astt = ReplyKeyboardMarkup(resize_keyboard=True).add(KeyboardButton(f"CATs[{fds}]"))
kbd = ReplyKeyboardMarkup(resize_keyboard=True)
btns = cur.execute(f'SELECT name FROM cathlete WHERE id = ?', (message.from_user.id,)).fetchall()
# btns - список списков.
if not btns:
# кнопки не предусмотрены, как-то даём пользователю знать об этом
return # если это фатально, останавливаемся тут
# иначе создаём какое-то значение btns по умолчанию и продолжаем
# тут уж сам решай
# делаем клавиатуру
for btn in btns:
kbd.add(KeyboardButton(btn[0]))
# ну и отправляем её вместе с сообщением
message.reply_to_message.username
, и догадываюсь, что message.reply_to_message
будет иметь значение None, если сообщение не является ответом... но я могу и ошибаться.@dataclass
class Person:
first_name: str
last_name: str
bdate: date
@classmethod
def make(cls, first_name: str, last_name: str, bdate: str) -> 'Person':
_bdate = datetime.strptime(bdate, '%Y%m%d').date()
return cls(first_name=first_name, last_name=last_name, bdate=_bdate)
data = {
'first_name': 'Adam',
'last_name': 'Smith',
'bdate': '20220617'
}
person = Person.make(**data)
@some_decorator_with_params(params)
def some_func(...):
...
# это всего лишь синтаксический сахар для
def some_func(...):
...
decorator = some_decorator_with_params(params)
some_func = decorator(some_func) # вызываем декоратор вручную
type=(.*?),
Тогда он будет пытаться сматчить как можно меньше.type=([a-zA-Z0-9_]+),