有没有办法在将对象附加到列表时保留正在创建的 python 对象的别名?
Is there a way to keep the alias of the python object being created when appending object to a list?
编辑:上下文 -
我正在生成代码以创建 dash 应用程序并将其保存到文件中。然后我将我的 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')]"
我不知道为什么有人想要这样做,但您可以使用 class 而不是导入别名来做到这一点:
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]
祝你好运。
可能这不是使用破折号的最有效方式,如果你想制作那个列表,真的没有必要使用 html
for i in test:
ls.append(f"html.Div('{}')".format(i))
那就return吧,这是在@callback
吗?
从我得到的问题来看,您正在尝试找到一种在函数中动态添加函数变量名称的方法。
如果这是您要尝试完成的用例,那么您可以这样做
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 __”属性。
希望这能解决您的问题。
简短的回答:不 - 因为对象的字符串表示形式是由它所在的模块生成的,而该模块不知道您是如何导入它的。
(假设我正确理解你的问题)。
您似乎想做的是创建一些对象结构(在本例中,来自 dash_html_components
模块),然后创建一个 Python 程序来重现该结构。的确,在许多情况下,print(some_python_object)
生成的字符串是有效的 Python 表达式,而该表达式 re-creates 是执行时的对象。然而,这绝不是 gua运行teed 并且不应依赖 - 大多数 Python 对象只是 best-effort 尝试生成这样的字符串。
在您引用的特定情况下,html.Div("1")
是 return 一个来自 dash_html_components
模块的 Div
类型对象的表达式。该对象的实现执行 return 一个 almost-valid "re-create-me" 字符串:即 Div("1")
。这是它能做的最好的——制作这个字符串的代码在 dash_html_components
模块中,如果 html.Div("1")
在同一个模块中是 运行,它确实会 re-create物体。但是,从您的 角度来看,该模块不知道如何访问它。您可能已经完成了 import dash_html_components
(那么,'re-create' 代码将是 dash_html_components.Div("1")
。或者,您可能已经完成了 import dash_html_components as h
,那么您需要 h.Div("1")
,等等。该对象的实现无法 'peeking' 进入您的代码以查明您是如何决定命名该模块供您自己使用的。
总的来说:
- 如果您使用
print(object)
(或任何其他导致执行 repr(object)
以生成字符串的表达式),请仅将结果用于您自己的查看/调试。生成有效的 Python 代码并不保证 运行。
- 如果您的目标是生成 Python 程序,最好使用字符串操作(如此处其他答案中所建议的那样)。
编辑:上下文 -
我正在生成代码以创建 dash 应用程序并将其保存到文件中。然后我将我的 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')]"
我不知道为什么有人想要这样做,但您可以使用 class 而不是导入别名来做到这一点:
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]
祝你好运。
可能这不是使用破折号的最有效方式,如果你想制作那个列表,真的没有必要使用 html
for i in test:
ls.append(f"html.Div('{}')".format(i))
那就return吧,这是在@callback
吗?
从我得到的问题来看,您正在尝试找到一种在函数中动态添加函数变量名称的方法。
如果这是您要尝试完成的用例,那么您可以这样做
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 __”属性。 希望这能解决您的问题。
简短的回答:不 - 因为对象的字符串表示形式是由它所在的模块生成的,而该模块不知道您是如何导入它的。
(假设我正确理解你的问题)。
您似乎想做的是创建一些对象结构(在本例中,来自 dash_html_components
模块),然后创建一个 Python 程序来重现该结构。的确,在许多情况下,print(some_python_object)
生成的字符串是有效的 Python 表达式,而该表达式 re-creates 是执行时的对象。然而,这绝不是 gua运行teed 并且不应依赖 - 大多数 Python 对象只是 best-effort 尝试生成这样的字符串。
在您引用的特定情况下,html.Div("1")
是 return 一个来自 dash_html_components
模块的 Div
类型对象的表达式。该对象的实现执行 return 一个 almost-valid "re-create-me" 字符串:即 Div("1")
。这是它能做的最好的——制作这个字符串的代码在 dash_html_components
模块中,如果 html.Div("1")
在同一个模块中是 运行,它确实会 re-create物体。但是,从您的 角度来看,该模块不知道如何访问它。您可能已经完成了 import dash_html_components
(那么,'re-create' 代码将是 dash_html_components.Div("1")
。或者,您可能已经完成了 import dash_html_components as h
,那么您需要 h.Div("1")
,等等。该对象的实现无法 'peeking' 进入您的代码以查明您是如何决定命名该模块供您自己使用的。
总的来说:
- 如果您使用
print(object)
(或任何其他导致执行repr(object)
以生成字符串的表达式),请仅将结果用于您自己的查看/调试。生成有效的 Python 代码并不保证 运行。 - 如果您的目标是生成 Python 程序,最好使用字符串操作(如此处其他答案中所建议的那样)。