如何从python中获取lua / translation中的类类型

时间:2016-01-01 13:46:57

标签: python class lua torch

我试图在lua中找到类似于类的东西。在python中,我会这样做:

a = {}
type(a)
>>>> dict

所以我在lua中有对象词汇。当我打印对象时,我得到:

print(vocab)
>>> {
3 : 20
o : 72
m : 70
d : 61
( : 9
}

我如何让lua吐出对象,类似于python中的type()? - 它将为您提供对象的类

2 个答案:

答案 0 :(得分:6)

There are 8 types in Lua:nil,boolean,number,string,function,thread, table userdata 。您可以使用内置的type()函数找出对象所属的基本类型:

type('Hello world')                    == 'string'
type(3.14)                             == 'number'
type(true)                             == 'boolean'
type(nil)                              == 'nil'
type(print)                            == 'function'
type(coroutine.create(function() end)) == 'thread'
type({})                               == 'table'
type(torch.Tensor())                   == 'userdata'

请注意torch.Tensor的类型是userdata。这是有道理的,因为torch库是用C语言编写的。

  

提供类型userdata以允许存储任意C数据   在Lua变量中。 userdata值是指向raw块的指针   记忆。 Userdata在Lua中没有预定义的操作,除了   作业和身份测试。

     

userdata的metatable放在注册表和__index中   字段指向方法表,使对象:method()   语法将起作用。

因此,处理userdata对象时,我们不知道它是什么,但有一个方法列表并可以调用它们。

如果自定义对象具有某种机制(方法或某种东西)来查看其自定义类型,那将会很棒。你猜怎么着?火炬对象有一个:

t = torch.Tensor()
type(t)       == 'userdata' # Because the class was written in C
torch.type(t) == 'torch.DoubleTensor'
# or
t:type()      == 'torch.DoubleTensor'

说到Torch。它有自己的对象系统模拟器,你可以自己创建一些火炬类,并以同样的方式检查它们的类型。但是,对于Lua,这些类/对象只不过是普通表。

local A = torch.class('ClassA')
function A:__init(val)
    self.val = val
end

local B, parent = torch.class('ClassB', 'ClassA')
function B:__init(val)
    parent.__init(self, val)
end

b = ClassB(5)
type(b)       == 'table' # Because the class was written in Lua
torch.type(b) == 'ClassB'
b:type() # exception; Custom Torch classes have no :type() method by defauld

答案 1 :(得分:3)

据说Lua定义了“机制,而不是政策”。课程将是一个“政策”。你可以随意实现类的效果; Lua提供了许多可用于实现此目的的机制。但Lua没有单一的方法来宣布这样的结构。

Lua的type标准方法只会返回一个Lua值的广义类别:数字,字符串,表等。而且由于Lua只有一种数据结构(表),所以每种类(不是从C)生成的将是“表”类型。

这有副作用,使Lua难以使用别人的政策。例如,如果Torch有办法将自己的“类”与常规表区分开来,那就行了。但它无法区分某些其他类实现与常规表。

因此,没有一般方法可以将表与某种形式的“类”区分开来。