代码之家  ›  专栏  ›  技术社区  ›  ymmx

如何通过将setter函数传递给jitclass本身来用它的字符串名更新jitclass变量?

  •  0
  • ymmx  · 技术社区  · 4 年前

    我正在寻找一种方法来修改 jitclass 名称为字符串的变量。 我试图编写setter和getter函数( get_A set_A ),我得到的方法是 jitclass公司

    numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
    non-precise type pyobject
    [1] During: typing of argument at <string> (3)
    
    File "<string>", line 3:
    <source missing, REPL/exec in use?>
    
    This error may have been caused by the following argument(s):
    - argument 1: cannot determine Numba type of <class 'tuple'>
    

    下面是最简单的例子:

    from numba import jitclass, int32, float64
    
    spec = [('A' ,float64),('B' ,float64),('C' ,float64)]
    
    @jitclass(spec)
    class maClass():
        def __init__(self,):
            self.A = 0.
    
        def get_A(self):
            return self.A
    
        def set_A(self, x):
            self.A = x
    
        def update(self, func, val):
            func(val)
    
    C1 = maClass()
    print('A',C1.A)
    
    Names= ['A']
    vals= [1.]
    
    func = getattr(C1,'set_'+Names[0])
    print(func)
    
    C1.update(func,vals[0])
    print('A',C1.A)
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   ymmx    4 年前

    这是我想出的解决办法。

    def get_Variable_Names():
        return ['A','B','C']
    

    get_Variable_Names

    def update_val(self, i, var):
        if i == 0:
            self.A = var
        elif i == 1:
            self.B = var
        elif i == 2:
            self.C = var
    

    为了使用这个函数,我在由返回的列表中搜索变量名的索引 获取变量名 然后打电话给 update_val jitclass的函数。

    listnames = get_Variable_Names()
    val = 1.
    name = 'A'
    index = listnames.index(name)
    C1.update_val(index,val)
    

    这是所有的密码。

    来自numba import jitclass,int32,float64

    def get_Variable_Names():
        return ['A','B','C']
    
    spec = [('A' ,float64),('B' ,float64),('C' ,float64)]
    
    @jitclass(spec)
    class maClass():
        def __init__(self,):
            self.A = 0.
            self.B = 0.
            self.C = 0.
    
        def update_val(self, i, var):
            if i == 0:
                self.A = var
            elif i == 1:
                self.B = var
            elif i == 2:
                self.C = var
    
    C1 = maClass()
    listnames = get_Variable_Names()
    val = 1.
    name = 'A'
    index = listnames.index(name)
    C1.update_val(index,val)
    
    val = 2.
    name = 'B'
    index = listnames.index(name)
    C1.update_val(index,val)
    
    val = 3.
    name = 'C'
    index = listnames.index(name)
    C1.update_val(index,val)
    print('A',C1.A)
    print('B',C1.B)
    print('C',C1.C)
    

    它不是我一直在找的,但现在已经找到了。

    listnames= ['A','B','C']
    
    for i, n in enumerate(listnames):
        if i == 0:
            print('if i == ' + str(i)+ ' :\n\tself.' + n + ' = var')
        else:
            print('elif i == ' + str(i) + ' :\n\tself.' + n + ' = var')