2

我正在使用 Python 2.5 在 Maya 中工作,编写动态热键管理器类并在尝试分配特定于实例的命令时遇到了麻烦,因为 nameCommands 在 mel 中表示为字符串。我最终得到如下命令:

<bla.Bla instance at 0x0000000028F04388>.thing = 'Dude'

我已经看到了很多关于 repr 和 eval 的主题,但是我下面的测试示例失败了。

class Foo:
    pass

f = Foo()
f.thing = 'Jeff'
rep = repr(f)
y = eval(rep) # errors here
name = y.thing

# Error: invalid syntax
# Traceback (most recent call last):
#   File "<maya console>", line 7, in <module>
#   File "<string>", line 1
#     <__main__.Foo instance at 0x00000000294D8188>
#     ^
# SyntaxError: invalid syntax # 

我假设我想要的是某种从字符串中获取该实例的正确对象的方法。如果我知道它的样子,我可以将字符串格式化为可评估的命令。 有关更多使用信息,请参阅我的 cgtalk 帖子

SO 相关主题:

这个说这是不可能的,但用户也想要一个用例,我希望我已经提供了。 如何从字符串中获取对象?

其他: repr的输出什么时候有用? 如何使用 print() 打印一个类或类的对象? 允许我的类实例的 repr() 由 eval() 解析 __repr__ 在 python 中的主要目的 如何在覆盖 python 中的 __str__ 方法后获取实例的地址 Python repr 类 如何使用'pickle'

4

2 回答 2

2

为了工作,需要覆盖eval内置函数。__repr__我没有看到你提到这一点,所以我认为你没有这样做。我正在粘贴我不久前写的代码片段。只是为了演示。在此示例中, eval 有效,因为__repr__已被覆盖:

class element :
    def __init__(self, a, m):
        self.name = a ;
        self.atomic_mass = m ;

    def __str__(self):
        return "{0} has atomic mass {1}".format(self.name, self.atomic_mass)

    def __repr__(self):
        return "element(\"{0}\", \"{1}\")".format(self.name, self.atomic_mass)

H = element("Hydrogen", 1.00794)
print H
print repr(H)
print eval(repr(H))

更多信息:http: //www.muqube.com/python/string-representation-of-python-objects/

于 2014-02-21T04:27:35.597 回答
1

在这里使用 id 作为字符串和 ctypes找到了一种似乎对我有用的方法

class Foo:
    pass

f = Foo()
f.thing = 'Jeff'

import ctypes    
long_f = id(f)
y = ctypes.cast(long_f,ctypes.py_object).value
name = y.thing

这里是 Maya 中的一个示例用法;

command = ("python(\"ctypes.cast(%s,ctypes.py_object).value.thing=False\")")%(id(self))
nameCommand = cmds.nameCommand( 'setThingOnPress', annotation='', command=command )
cmds.hotkey( keyShortcut='b', name=nameCommand)
于 2014-02-21T05:35:10.450 回答