Допустим, у меня есть пакет с именем pkg
, который содержит модуль с именем helpers.py
.
В пределах helpers.py
У меня есть функция с именем short_to_long
Эта функция выглядит следующим образом this:
def short_to_long():
alias = {'m':'meter',
's':'sec',
'sec':'second',
'deg':'degree',
'rad':'radian',
'm/s':'meter/sec',
'1/s':'1/sec',
'1/sec': '1/second'}
return alias
По сути, это просто словарь, в котором есть ключи со связанными значениями, которые являются длинными версиями короткого ключа. Я использую это для преобразования строк единиц измерения в нужную мне c строку (т. Е. В метр).
Иногда, когда я использую строку единиц измерения, которая не является ключом, я, очевидно, получаю ошибку. Когда это происходит, я могу вручную отредактировать словарь, чтобы он содержал эту запись, чтобы в следующий раз я не столкнулся с этой строкой модуля. Это не раздражает.
Это раздражает делать вручную.
Есть ли способ изменить исходный код функции прямо из оболочки python? Что я хочу сделать, это просто добавить запись в этот словарь автоматически при возникновении ошибки.
Прямо сейчас мой код выглядит примерно так:
import inspect
from pkg.helpers import short_to_long
from copy import deepcopy
key = 'new_unit_short'
val = 'new_unit_long'
file = inspect.getsourcefile(short_to_long)
source = inspect.getsourcelines(short_to_long)[0]
new_line = f"{' '*13}'{key}':'{val}',\n"
new_source = deepcopy(source)
new_source[-3] += new_line
with open(file, 'r') as f:
full_source = f.read()
full_source = full_source.replace(''.join(source), ''.join(new_source))
with open(file, 'w') as out:
out.write(full_source)
Я могу обернуть это в функцию и используйте в моем основном коде инструкцию try / исключением, которая в основном делает это - попробуйте найти длинную строку, если она не существует, запустите эту функцию, чтобы добавить ее.
Как вы можете видеть, это ужасно трудоемкая работа вокруг. Должен быть лучший способ.
Я нашел похожий вопрос здесь: ссылка
, но ответы, похоже, очень похожи на то, что я уже делаю .
Должен быть какой-то способ сделать это, какой-то подход машинного обучения? Я не знаю.
Интересно узнать, есть ли у кого-нибудь идеи?
Спасибо