【问题标题】:Python class written in string to literal object以字符串形式写入文字对象的 Python 类
【发布时间】:2020-12-01 07:29:48
【问题描述】:

我正在尝试将一个以字符串格式编写的类保存到数据库中,然后读取它并将该类加载为文字类。

我该怎么做?

test = """
class Test:
    def __init__(self, test_name):
        self.test_name = test_name
    
    def print_name(self):
        print(self.test_name)
"""

Test = eval(test)
test_obj = Test(test_name='test1')

如果我也知道如何以字符串格式保存对象实例会更好,因为我也会将实例保存到数据库中,就像保存泡菜一样。

非常感谢。

【问题讨论】:

  • 将代码另存为字符串似乎不是一个好主意……这样的用例是什么?为什么不泡菜……?
  • Pickle 需要类定义才能加载它。如果没有该类,它将无法加载其数据。我想随时保存课程,就像 javascript 中的脚本一样,其中一些将从数据库中删除或标记,因此我将以不同的方式使用它们..
  • @deceze 为了进一步解释,我正在开发许多机器学习模型,模型之间可能略有不同,所以我想保存它们并使用性能最好的模型......

标签: python string class object


【解决方案1】:

几乎是重复的,但我必须结合两个答案。 如果您将课程保存在一个文件中 - 您可能已经保存了 - 您很幸运:

根据here你要使用inspect.getsource

根据here,您需要在字符串上调用exec 函数来检索保存的类。

把东西放在一起:

import inspect

class Test:
    def __init__(self):
        self.a = 1
    def print(self):
        print(self.a)

text = inspect.getsource(Test)
exec(text)

至于检索未保存在文件中的类的代码,我没有找到方法,第一个链接问题的答案表明没有。

【讨论】:

  • 这会导致错误“TypeError: main'> is an built-in class”
  • 这个确切的ctrl+c'd 代码或您将此代码应用于您的问题?我正在运行 python 3,这是在一个单独的源文件中,它是唯一正在运行的代码。有用。所以我无法重现错误。但是,在我看来,您正在调用 getsource 导致错误的内置内容。如第一个答案所述,这仅适用于您保存在文件中的代码。
  • 我在 jupyter notebook 上运行它,但只有上面的源,在单个单元格中运行。
  • 我不确定 jupyter notebook 是否有资格将源代码保存在文件中。我不怎么用它们。您能否尝试在通用 .py 文件中运行代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2016-03-12
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多