Сгенерировать декодируемую строку из набора переменных

#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. Как в указанном вами примере: