простой способ обновить исходный код импортированной функции из оболочки python? - PullRequest
0 голосов
/ 16 января 2020

Допустим, у меня есть пакет с именем 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 / исключением, которая в основном делает это - попробуйте найти длинную строку, если она не существует, запустите эту функцию, чтобы добавить ее.

Как вы можете видеть, это ужасно трудоемкая работа вокруг. Должен быть лучший способ.

Я нашел похожий вопрос здесь: ссылка

, но ответы, похоже, очень похожи на то, что я уже делаю .

Должен быть какой-то способ сделать это, какой-то подход машинного обучения? Я не знаю.

Интересно узнать, есть ли у кого-нибудь идеи?

Спасибо

...