Python 这个for循环的目的是什么?
我跟随《黑帽Python》一书,目前的活动是构建一个netcat替代品。要设置选项,请使用“getopt”。我不明白为什么在for循环中使用来检查选项Python 这个for循环的目的是什么?,python,Python,我跟随《黑帽Python》一书,目前的活动是构建一个netcat替代品。要设置选项,请使用“getopt”。我不明白为什么在for循环中使用来检查选项 if not len(sys.argv[1:]): usage() # read the command line options try: opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", \ ["he
if not len(sys.argv[1:]):
usage()
# read the command line options
try:
opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", \
["help", "listen", "execute", "target", "port", "command", "upload"])
except getopt.GetoptError as err:
print(str(err))
usage()
for o,a in opts:
if o in ("-h","--help"):
usage()
elif o in ("-l", "--listen"):
listen = True
elif o in ("-e", "--execute"):
execute = a
elif o in ("-c", "--commandshell"):
command = True
elif o in ("-u", "--upload"):
upload_destinaton = a
elif o in ("-t", "--target"):
target = a
elif o in ("-p", "--port"):
port = int(a)
else:
assert False,"Unhandled Option"
如果您查看,则有一个示例演示了这一点:
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] # <--- HERE
>>> args
['a1', 'a2']
导入getopt
>>>args='-a-b-cfoo-d bar a1 a2'.split()
>>>args
['-a'、'-b'、'-cfoo'、'-d'、'bar'、'a1'、'a2']
>>>optlist,args=getopt.getopt(args'abc:d:')
>>>光学列表
[('-a','')('-b','')('-c',foo'),('-d',bar')]#>>args
['a1','a2']
opts
(在您的问题中)对应于上例中的optlist
getopt
返回一个元组列表作为第一个返回值(列表作为第二个返回值),因此通过在opts中为o使用,代码会在每次循环迭代期间将这些元组拆分。opts
是一个选项、值对的列表。见:
返回值由两个元素组成:第一个是(选项,值)对的列表;第二个是剥离选项列表后留下的程序参数列表(这是参数的后续部分)。返回的每个选项和值对都将选项作为其第一个元素,前缀为短选项的连字符(例如“-x”)或长选项的两个连字符(例如“---long option”),选项参数作为其第二个元素,如果选项没有参数,则为空字符串。这些选项在列表中的出现顺序与找到它们的顺序相同,因此允许多次出现。多头和空头期权可能是混合的
因此for循环一次处理每个命令行参数,即选项、值对。参数的数量可能在数量上有所不同
您对更具体的内容感兴趣吗?是的,我想知道为什么要使用“o”和“a”选项。“o”是否表示getopt中的某些内容?啊,o
和a
是循环构造中的任意变量名;它们也可以是x
和y
。重要的是for
循环将opts中每个2元组中的两个项分配给它们。(opts只是一个与option:value对相对应的2元组列表,正如上面@Kingsley所演示的)getopt
并非真正用于新代码,而是作为移植使用getopt
库的现有程序的一种帮助。您应该使用argparse
来处理命令行选项。