看scikit-learn的源码时,在benchmark的benchmark_20newsgroups.py(关于20newsgroups数据集看这里)中看到了一个有意思的用法,如下:
1 import argparse 2 3 ESTIMATORS = { 4 "dummy": DummyClassifier(), 5 "random_forest": RandomForestClassifier(n_estimators=100, 6 max_features="sqrt", 7 min_samples_split=10), 8 "extra_trees": ExtraTreesClassifier(n_estimators=100, 9 max_features="sqrt", 10 min_samples_split=10), 11 "logistic_regression": LogisticRegression(), 12 "naive_bayes": MultinomialNB(), 13 "adaboost": AdaBoostClassifier(n_estimators=10), 14 } 15 16 parser = argparse.ArgumentParser() 17 parser.add_argument('-e', '--estimators', nargs="+", required=True, 18 choices=ESTIMATORS) 19 args = vars(parser.parse_args()) 20 21 22 for name in sorted(args["estimators"]): 23 clf = ESTIMATORS[name]
如果让我实现的话,我多半会这样:
1 ESTIMATORS = { 2 "dummy": DummyClassifier(), 3 "random_forest": RandomForestClassifier(n_estimators=100, 4 max_features="sqrt", 5 min_samples_split=10), 6 "extra_trees": ExtraTreesClassifier(n_estimators=100, 7 max_features="sqrt", 8 min_samples_split=10), 9 "logistic_regression": LogisticRegression(), 10 "naive_bayes": MultinomialNB(), 11 "adaboost": AdaBoostClassifier(n_estimators=10), 12 } 13 14 names = [] 15 16 for key, value in ESTIMATORS.items(): 17 names.append(key) 18 19 for name in sorted(names): 20 clf = ESTIMATORS[name]
这两种方法有什么优缺点呢?第一种的写法,行数多了一两行,不够简洁;第二种写法,虽然“简洁”了,但变量的使用在过程中,在程序主体中,在流程上不够清晰,反观第一种写法,将字典变量作为参数传递给函数,因此整个逻辑就清晰许多。
==================================================================================
argparser本身是python中用来处理命令行参数的一个工具,应用格式见文档。