我刚刚在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在样式方面看起来也不错。