Python:处理对象列表中的参数。

Python:处理对象列表中的参数。,python,list,object,args,Python,List,Object,Args,所以我有下面的代码。merge_files函数基本上合并两个文件字符串并返回一个列表。此列表用于从对象提供参数 文件1 文件2 问题是,当直接给对象赋值时,函数grade_compass工作正常。当对象从解析器中提取相同的值时,它似乎没有通过这个函数 全部代码: from ast import literal_eval class Compass: #initialize the attributes def __init__(self, coordX, coordY

所以我有下面的代码。merge_files函数基本上合并两个文件字符串并返回一个列表。此列表用于从对象提供参数

文件1

文件2

问题是,当直接给对象赋值时,函数grade_compass工作正常。当对象从解析器中提取相同的值时,它似乎没有通过这个函数

全部代码:

    from ast import literal_eval


class Compass:

   #initialize the attributes
    def __init__(self, coordX, coordY, coordZ, Pos):
        self.coordx = coordX
        self.coordy = coordY
        self.coordz = coordZ
        self.coord_pos = Pos



def merge_files(infile1, infile2):
    with open(infile1) as f1, open(infile2) as f2:
        l3 = [] # this is a list for storing all the lines from both files
        f1_lists = (literal_eval(line) for line in f1)
        f2_lists = (literal_eval(line) for line in f2)
        for l1, l2 in zip(f1_lists, f2_lists):
            l3.append(l1 + l2)
        return l3 # Return all the lines from both text files


def check_step_xrange(coordx):
    if coordx > 0.00 and coordx < 7.99:
        return "short"

def check_step_zrange(coordz):
    if coordz > 4.40 and coordz < 20.00:
        return "short"

# Ignore coordy for now
def grade_compass(coordx, coordy, coordz):
    if check_step_xrange(coordx) == "short" and check_step_zrange(coordz) == "short":
        compass_degree = "compass degree is short"
        return compass_degree


def main():
    file1 = "coordinates1.txt"
    file2 = "coordinates2.txt"
    args = merge_files(file1, file2)

    # List of instances
    compasslist = [Compass(args[i][0], args[i][1], args[i][2], args[i][3]) for i in range(len(args))]

    # I just pull the first instance
    print "\nThis is the object from the object list"
    print compasslist[0].coordx + ' ' + compasslist[0].coordy + ' ' + compasslist[0].coordz + ' ' + compasslist[0].coord_pos
    print grade_compass(compasslist[0].coordx, compasslist[0].coordy, compasslist[0].coordz)

    print "\nThis is the object manually given"
    h = Compass(2.02, -3.88, 15.25, 'P1')
    print h.coordx, h.coordy, h.coordz, h.coord_pos
    print grade_compass(h.coordx, h.coordy, h.coordz)
if __name__ == '__main__':
    main()
期望输出:

This is the object from the object list
2.02 -3.88 15.25 P1
compass degree is short


This is the object manually given
2.02 -3.88 15.25 P1
compass degree is short

我猜这是Python2.x而不是Python3.x

在Python2中,比较运算符总是成功的——字符串总是大于整数或浮点。在Python3中,这是一个类型错误


因此,在这段代码中,基本上您的问题是,您从未将从文件中读取的字符串转换为浮点数。

这是两种方法之间的区别:

Compass(args[i][0], args[i][1], args[i][2], args[i][3])

Compass(2.02, -3.88, 15.25, 'P1')
在前者中,所有参数都是字符串。因此,如果无法保证输入始终正确,则需要对其进行强制转换或解析:

Compass(float(args[i][0]), float(args[i][1]), float(args[i][2]), args[i][3])

当if检入grade_罗盘失败时,函数返回None。这意味着您应该在检查之前打印出grade_compass中的参数,以便找出为什么给出给if的表达式的计算结果为False.Env实际上是Python 2.x,这就是为什么它没有泄漏任何错误。感谢您的及时回复!是的,在grade_compass函数中转换为float可以解决这个问题。感谢您的及时回复!
This is the object from the object list
2.02 -3.88 15.25 P1
compass degree is short


This is the object manually given
2.02 -3.88 15.25 P1
compass degree is short
>>> 2 > "2"
False
>>> 2 < "2"
True
>>> 2 < "1"
True
>>> 2 < "-500"
Compass(args[i][0], args[i][1], args[i][2], args[i][3])

Compass(2.02, -3.88, 15.25, 'P1')
Compass(float(args[i][0]), float(args[i][1]), float(args[i][2]), args[i][3])