我使用的是一个python文件commands.py 导入命令
该文件如下:
import datetime
def what_time_is_it():
today = datetime.date.today()
return(str(today))
def list_commands():
all_commands = ('list_commands', 'what time is it')
return(all_commands)
我希望主脚本列出commands.py中的函数,所以我使用的是dir(commands)
,它给出了输出:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'datetime', 'list_commands', 'what_time_is_it']
然后我尝试使用正则表达式删除包含'__'的项目,如下所示:
commands_list = dir(commands)
for com in commands_list:
if re.match('__.+__', com):
commands_list.remove(com)
else:
pass
这不起作用。如果我在没有for循环或正则表达式的情况下尝试这样做,它声称该条目(我刚从print(list)复制并粘贴的列表不在列表中。
作为第二个问题,我可以让dir只列出函数,而不是'datetime'吗?
答案 0 :(得分:5)
您在迭代时无法修改列表,而是使用列表推导:
commands_list = dir(commands)
commands_list = [com for com in commands_list if not re.match('__.+__', com)]
作为第二个问题,您可以使用callable
检查变量是否可调用。
答案 1 :(得分:4)
我会在这里使用列表组合:
commands_list = [cmd for cmd in commands_list if not (cmd.startswith('__') and cmd.endswith('__'))]
答案 2 :(得分:1)
使用list comprehension,试试这个:
[item for item in my_list if '__' not in (item[:2], item[-2:])]
<强>输出:强>
>>> [item for item in my_list if '__' not in (item[:2], item[-2:])]
['datetime', 'list_commands', 'what_time_is_it']
使用filter()
:
filter(lambda item: '__' not in (item[:2], item[-2:]), my_list) # list(filter(...)) for Python 3
答案 3 :(得分:0)
您可以filter
列表:
commands_list = filter(lambda cmd: not re.match('__.+__', cmd), dir(commands))
这会过滤掉not
与正则表达式匹配的所有项目。