Python开关函数
我一直在尝试编写一个简单的端口扫描器,它使用了一个用if构建的简单开关函数。我已经在这里找到了一个正确的解决方案,让如何使开关函数像C++或类似语言一样可用。我发现这个问题已经在这里讨论过了,我尝试过其中的一些方法,但到目前为止还没有任何运气使它正常运行。无论我从链接中选择了什么方法,我总是在第二个开关案例中遇到语法错误,如下所示:Python开关函数,python,switch-statement,Python,Switch Statement,我一直在尝试编写一个简单的端口扫描器,它使用了一个用if构建的简单开关函数。我已经在这里找到了一个正确的解决方案,让如何使开关函数像C++或类似语言一样可用。我发现这个问题已经在这里讨论过了,我尝试过其中的一些方法,但到目前为止还没有任何运气使它正常运行。无论我从链接中选择了什么方法,我总是在第二个开关案例中遇到语法错误,如下所示: File "/home/h4v0kkx0008c/Desktop/Sources/setup/PortScannerV1.py", line 44 if cas
File "/home/h4v0kkx0008c/Desktop/Sources/setup/PortScannerV1.py", line 44
if case(2):
^
SyntaxError: invalid syntax
这里可能有什么问题
这是我到目前为止编写的完整代码:
从套接字导入*
导入时间、套接字、操作系统、系统、字符串、argparse、日志、数学
n=原始输入(“选择端口范围:\n(1)标准端口:0-1025\n(2)中间端口:1025-5000\n(3)更高范围:5000-49151\n(4)最高范围:49151-65535\n(5)所有端口:0-65535\n(6)自定义”)
类开关(对象):
值=无
定义新定义(类别,值):
类值=值
返回真值
def案例(*参数):
返回任意((arg==args中arg的switch.value))
while开关(n):
如属第(1)种情况:
打印“您的选择是:标准端口”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围(0,1025)内的i:
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
如属第(2)种情况:
打印“您的选择是:中等范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(10255000):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(3)种情况:
打印“您的选择是:更高范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(50049151):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(4)种情况:
打印“您的选择是:最高范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(49151、65535):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(5)种情况:
打印“您的选择是:所有端口”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围(065535)内的i:
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(6)种情况:
打印“您的选择是:自定义”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
startPort=原始输入(“指定起始端口:”)
endPort=原始输入(“指定结束端口:”)
对于范围内的i(起始端口、结束端口):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
您试图解决此问题的方式似乎不符合python。由于python中不存在switch语句,您可以使用字典模拟类似于switch的行为,因为函数和类是python中的第一类对象
def func1():
# do some operation
def func2():
# some other operation
def default_func():
# some default action
options = {
'1': func1,
'2': func2,
'default': default_func
}
value = raw_input('enter a number')
result = options.get(int(value), options.get('default'))()
如果您的函数足够简单,那么您肯定可以使用lambdas作为值,这肯定会更简洁。您试图解决此问题的方式似乎并不符合python。由于python中不存在switch语句,您可以使用字典模拟类似于switch的行为,因为函数和类是第一类python中的ss对象
def func1():
# do some operation
def func2():
# some other operation
def default_func():
# some default action
options = {
'1': func1,
'2': func2,
'default': default_func
}
value = raw_input('enter a number')
result = options.get(int(value), options.get('default'))()
如果你的函数足够简单,你肯定可以使用lambdas作为值,这肯定会更简洁。如果你需要在case-equired语句中的代码块之间共享一组局部变量,那么函数的dict可能不是正确的答案。至少你必须将上下文实体传递给或者使用
\uuu init\uuu()
将它们转换为类方法,以初始化它们并将上下文存储在self.where中
更简单的方法就是使用
if switchvar == value1:
...
elif switchvar==value2:
...
elif # as many more as you need
else: #default
...
这与case语句的不同之处在于,不能从一个块的末尾流到下一个块(而对于函数,则可以从其他块中调用)。注意,在使用case语句的语言中,如果没有大量注释,则不允许从case语句中的一个块的末尾流到下一个块。这通常是一个bug,尽管偶尔有用
注意[value1,value2,value3,…]中的Pythonic
if变量:
相当于同一块顶部的value1、value2等的多个case标签。如果需要在case-equivalent语句中的代码块之间共享一组局部变量,那么函数dict可能不是正确答案。至少您必须将上下文实体传递给所有f或者使用\uuu init\uuuu()
将它们转换为类方法,以初始化它们并将上下文存储在self.where中
更简单的方法就是使用
if switchvar == value1:
...
elif switchvar==value2:
...
elif # as many more as you need
else: #default
...
这与case语句的不同之处在于,不能从一个块的末尾流到下一个块(而对于函数,则可以从其他块中调用)。注意,在使用case语句的语言中,如果没有大量注释,则不允许从case语句中的一个块的末尾流到下一个块。这通常是一个bug,尽管偶尔有用
请注意,[value1,value2,value3,…]中的Pythonicif变量:
相当于位于