#python #string #hash #decode #encode
#python #строка #хэш #декодировать #кодировать
Вопрос:
У меня есть код, в котором есть несколько переменных конфигурации (различных типов). Для каждого набора конфигураций я генерирую файл. Я хочу назвать этот файл на основе конфигурации, которую я использовал для создания файла. Однако, поскольку у меня около 20 конфигураций, имя файла становится слишком большим, если я просто использую значения конфигурации в виде строк и объединяю в имя файла.
Есть ли способ сгенерировать строку из набора переменных, которую я могу позже декодировать в исходные значения переменных (чтобы я мог узнать конфигурации, которые я использовал для файла)? Имя файла может быть тарабарским и длинным (до тех пор, пока оно может использоваться в качестве имени файла в Linux)
т. Е. мне нужно что-то вроде этого
conf1 = 10
conf2 = (20,2)
conf3 = "some string"
conf4 = {'c1': 10, 'c2': None}
filename = get_filename(conf1, conf2, conf3, conf4) # Encode function
conf1_, conf2_, conf3_, conf4_ = str2conf(filename) # Decode function
Ответ №1:
Вот что я сделал, если кто-нибудь столкнулся с подобной проблемой. Здесь у меня есть только int
, float
и bool
конфигурации, указанные в словаре
def encode_args(*, r:float, l:float, s:float, c:int, f:int, n:int, L:int, H:int, p:float, C:int, e:bool) -> str:
return f"r{int(r/1000)}l{int(l*1000)}s{int(s*1000)}c{c}f{f}n{n}"
f"L{L}H{H}p{int(p*100)}C{C}e{1 if e else 0}"
import re
def decode_str(string) -> dict:
r, l, s, c, f, n, L, H, p, C, e =
re.search(r'r(d )l(d )s(d )c(d )f(d )n(d )L(d )H(d )p(d )C(d )e(d)', string).groups()
r, l, s, c, f, n, L, H, p, C, e = map(int, [r, l, s, c, f, n, L, H, p, C, e])
r *= 1000
l /= 1000
s /= 1000
p /= 100
e = e == 1
return dict(r=r, l=l, s=s, c=c, f=f, n=n, L=L, H0=H, p=p, C=C, e=e)
Ответ №2:
Если количество возможных конфигураций фиксировано на 20, вы могли бы закодировать каждую буквой алфавита (т. Е. config1 = ‘A’, config2= ‘B’, ….) Затем назовите свой файл на основе до 20 букв, обозначающих конфигурации, используемые для создания файла.
Кодировка может быть инкапсулирована в словаре либо с помощью кодированного символа: config, либо наоборот.
Вот что я имею в виду, используя ваш пример:
conf1 = 10
conf2 = (20, 2)
conf3 = "some string"
conf4 = [4,5,6]
nam_dict = {conf1:'A', conf2:'B', conf2:"C", conf4:'D'}
filename=get_filename(conf1, conf2, conf3, conf4)
def get_filename(*cnfigs):
fs = 'f'
for k in cnfigs:
fs = nam_dict[k]
return fs
Комментарии:
1. Я не совсем понимаю ваш ответ. Да, количество конфигураций фиксировано, но значения, которые эти конфигурации могут иметь, варьируются в большом диапазоне. Как вы предлагаете сгенерировать имя файла из ‘A’-
10.123
, ‘B’-{'c1': 10, 'c2': None}
?2. Как в указанном вами примере: