我刚刚在Uni大学度过了最后一个学期的学习python。我真的很喜欢它,并希望获得一些有关如何编写更多“pythonic”代码的提示。

这是我最近完成的作业中的__init__类。在我编写它的时候,我试图弄清楚如何使用lambda或以更整洁,更有效的方式来重写它,但是用光了时间。

def __init__(self, dir):

    def _read_files(_, dir, files):

        for file in files:

            if file == "classes.txt":
                class_list = readtable(dir+"/"+file)
                for item in class_list:
                    Enrol.class_info_dict[item[0]] = item[1:]
                    if item[1] in Enrol.classes_dict:
                        Enrol.classes_dict[item[1]].append(item[0])
                    else:
                        Enrol.classes_dict[item[1]] = [item[0]]

            elif file == "subjects.txt":
                subject_list = readtable(dir+"/"+file)
                for item in subject_list:
                    Enrol.subjects_dict[item[0]] = item[1]

            elif file == "venues.txt":
                venue_list = readtable(dir+"/"+file)
                for item in venue_list:
                    Enrol.venues_dict[item[0]] = item[1:]

            elif file.endswith('.roll'):
                roll_list = readlines(dir+"/"+file)
                file = os.path.splitext(file)[0]
                Enrol.class_roll_dict[file] = roll_list
                for item in roll_list:
                    if item in Enrol.enrolled_dict:
                        Enrol.enrolled_dict[item].append(file)
                    else:
                        Enrol.enrolled_dict[item] = [file]


    try:
        os.path.walk(dir, _read_files, None)
    except:
        print "There was a problem reading the directory"

如您所见,它有点笨重。如果任何人有时间或喜欢的话,我将非常感谢一些有关python最佳实践的提示。

谢谢。

最佳答案

可以稍微清理一下代码的几件事:

使用字典的setdefault。如果缺少 key ,则将其设置为您提供的默认值,然后将其返回。否则,它将仅忽略第二个参数,并返回字典中的内容。这样可以避免笨拙的if语句。

Enrol.venues_dict.setdefault(key, []).append(file)

>>> x = {}
>>> x.setdefault(99, []).append(5)
>>> x.setdefault(99, []).append(6)
>>> x
{99: [5, 6]}
>>> x.setdefault(100, []).append(1)
>>> x
{99: [5, 6], 100: [1]}

另一种可能性是使用os.path.join来创建文件路径。这比仅进行字符串连接更为安全。
os.path.join(dir, file)

除此之外,IMO在样式方面看起来也不错。

09-09 19:47
查看更多