Добавить в словарь по значению (и создать ключ) [дублировать]

На этот вопрос уже есть ответ здесь:

В Django часто приходится добавлять много переменных в словарь (контекст в представлениях). Имена этих переменных часто большие, чтобы было понятно, что это такое.

Образец:

userprofile_creation_form = UserProfileCreationForm()

Неудобно, когда у вас много таких переменных, писать для них ключи, так как ключи часто совпадают с именами переменных.

context['userprofile_creation_form'] = userprofile_creation_form
... imagine 6 other variables
... 
...

Поэтому я хотел бы иметь возможность поместить переменную в словарь, просто используя эту переменную, и имя будет сгенерировано из ее имени.

Нравится:

context.add(userprofile_creation_form)

>>> context 
>>> {'userprofile_creation_form':<Form userprofile_creation_form>, ... }

Возможно ли это сделать каким-то образом в python или есть какой-то модуль или обходной путь, который может обеспечить это поведение?

1 ответ

  1. В следующем примере form.__class__.__name__дается имя класса form:

    for form in my_forms:
        k = ''.join('_{}'.format(c.lower()) if c.isupper() else c for c in form.__class__.__name__).lstrip('_')
        context[k] = form
    

    Образец:

    >>> class MyForm1:
    ...     pass
    ...
    >>> class MyForm2:
    ...     pass
    ...
    >>>
    >>> my_forms = [MyForm1(), MyForm2()]
    >>>
    >>> context = {}
    >>>
    >>> for form in my_forms:
    ...     k = ''.join('_{}'.format(c.lower()) if c.isupper() else c for c in form.__class__.__name__).lstrip('_')
    ...     context[k] = form
    ...
    >>> context
    {'my_form1': <__main__.MyForm1 instance at 0x0000000002653188>, 'my_form2': <__main__.MyForm2 instance at 0x0000000002653548>}
    >>>
    

    Если вы хотите добавить формы contextс точным именем, используйте:

    >>> for form in my_forms:
    ...     context[form.__class__.__name__] = form
    ...
    >>> context
    {'MyForm2': <__main__.MyForm2 instance at 0x0000000002713548>, 'MyForm1': <__main__.MyForm1 instance at 0x0000000002713188>}