Есть ли способ сохранить псевдоним создаваемого объекта python при добавлении объекта в список? - PullRequest
0 голосов
/ 04 июня 2019

РЕДАКТИРОВАТЬ: Контекст -

Я генерирую код для создания приложения-черточки и сохраняю его в файл. Затем я указываю свой файл app.py, чтобы взять сгенерированный код для отображения приложения plotly dash. Это быстрее, чем динамическое создание приложения, потому что в процессе генерации кода я обращаюсь к базе данных, чтобы получить информацию метаданных.

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

from dash_html_components import Div


Я хочу составить список объектов и сохранить псевдоним, используемый при импорте объектов.

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

import dash_html_components as html
test = [1,2,3,4]
ls = []
for i in test:
    ls.append(html.Div('{}'.format(i)))

Выход:

"[Div ('1'), Div ('2'), Div ('3'), Div ('4')]"

Желаемый вывод

"[html.Div ('1'), html.Div ('2'), html.Div ('3'), html.Div ( '4')] "

Ответы [ 4 ]

1 голос
/ 04 июня 2019

Вероятно, это не самый эффективный способ использования тире, если вы хотите создать этот список, на самом деле нет необходимости использовать html

for i in test:
    ls.append(f"html.Div('{}')".format(i))

, а затем просто вернуть его, это в@callback?

1 голос
/ 04 июня 2019

Я не знаю, почему кто-то хотел бы сделать это, но вы могли бы сделать это, используя класс вместо псевдонима импорта:

import dash_html_components

class html:
  def Div(*args):
    return dash_html_components.Div(*args)

test, ls = [1, 2, 3, 4], []

for i in test:
  ls.append(html.Div('{}'.format(i)))

Или вы хотите сказать, что хотите массив строк? Если это так, используйте вместо этого код:

import dash_html_components as html

test, ls = [1, 2, 3, 4], []

for i in test:
  ls.append("html.Div('{}')".format(i))

ПРИМЕЧАНИЕ: Вы также можете использовать понимание списка, например:

ls = [html.Div('{}'.format(i)) for i in test]

Удачи.

0 голосов
/ 04 июня 2019

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

(при условии, что я правильно понимаю ваш вопрос).

То, что вы пытаетесь сделать, - это создать некоторую структуру объектов (в данном случае из модуля dash_html_components), а затем создать программу на Python, которая воспроизводит эту структуру.Это правда, что во многих случаях print(some_python_object) создает строку, которая является допустимым выражением Python, и это выражение воссоздает объект при выполнении.Однако это никоим образом не гарантируется и на них нельзя полагаться - большинство объектов Python просто делают все возможное, чтобы создать такую ​​строку.

В указанном вами конкретном случае html.Div("1") является выражениемкоторый возвращает один объект типа Div из модуля dash_html_components.Реализация этого объекта возвращает почти допустимую строку «re-create-me»: а именно Div("1").Это лучшее, что он может сделать - код для создания этой строки находится в модуле dash_html_components, и если бы html.Div("1") был запущен в этом же модуле, он действительно воссоздает объект.Однако этот модуль понятия не имеет, как к нему обращаться с вашей точки зрения.Возможно, вы сделали import dash_html_components (тогда код 're-create' был бы dash_html_components.Div("1"). Или вы могли бы сделать import dash_html_components as h, тогда вам нужно h.Div("1") и т. Д. Реализация объекта не имеет способа 'загляните в ваш код, чтобы узнать, как вы решили назвать модуль для собственного использования.

В общем:

  • , если вы используете print(object) (или любое другое выражение, котороеприводит к выполнению repr(object) для создания строки), используйте результат только для собственного просмотра / отладки. Не гарантируется создание корректного кода Python.
  • , если ваша цель - создать программу Python,Лучше всего сделать это, используя манипуляции со строками (как предлагается в других ответах здесь).
0 голосов
/ 04 июня 2019

Из вопроса, который я получаю, вы пытаетесь найти способ динамически добавлять имя переменной функции в вашу функцию.

Если это тот вариант использования, который вы пытаетесь выполнить, то выможет сделать так

import dash_html_components as html
test = [1,2,3,4]
ls = []
for i in test:
    ls.append(html.__name__ + html.Div('{}'.format(i))) 

, это работает, потому что каждому объекту модуля назначен атрибут "__name __" по умолчанию.Надеюсь, это решит вашу проблему.

...