我想缩短这个函数的任何项目的任何部分列表:筛选任何包含从其他列表
def get_filenames(path, banned_files=()):
file_list = []
for root, _, files in os.walk(path):
BANNED_FILES = banned_files
for f in files:
for string in BANNED_FILES:
if string in f:
continue
path = os.path.join(root, f)
file_list.append(path)
return file_list
这样使用:
filenames = get_filenames(CLIENT_TESTS_PATH, banned_files=['__init__.py', '.pyc', 'accounts.py, otherfile.py'])
使得从任何文件CLIENT_TESTS_PATH
没有任何被禁止的文件。我不能仅仅检查文件路径是否在带有列表理解的禁止文件中,因为我关心是否可以在客户端文件中的任何位置找到禁止的文件。我怎样才能缩短这与一个过滤器,列表理解和或lambda有效?我只想要那个目录下的文件,而不是下面的目录。 谢谢
对于
def get_files(path, banned_files=[]):
return [os.path.join(root, fname) for root, _, fnames in os.path.walk(path) for fname in fnames \
if not any(bad_fname in fname for bad_fname in banned_files)]
我得到
In [2]: CLIENT_TESTS_PATH = "/home/cchilders/work_projects/webapi"
In [3]: get_files(CLIENT_TESTS_PATH)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-3c5a75968d68> in <module>()
----> 1 get_files(CLIENT_TESTS_PATH)
/home/cchilders/scripts/my_scripting_library/sysadmin.py in get_files(path, banned_files)
15
16 def get_files(path, banned_files=[]):
---> 17 return [os.path.join(root, fname) for root, _, fnames in os.path.walk(path) for fname in fnames \
18 if not any(bad_fname in fname for bad_fname in banned_files)]
19
TypeError: walk() takes exactly 3 arguments (1 given)
不要使用可变默认参数 - 见http://stackoverflow.com/q/1132941/3001761 – jonrsharpe
在他的代码,这不是一个问题,因为OP不会改变参数,也不会尝试返回它。 – zmo
@zmo - 你说得对。这里没有危险。但它仍然不是一个好习惯。一个元组也可以在默认情况下工作。 – mgilson