如何优化以避免使用过多的"if""elif""else"语句

  • 本文关键字:quot if 语句 else elif 优化 何优化 python-3.x
  • 更新时间 :
  • 英文 :


我想判断浏览器类型并对此做点什么,但我检查并发现init函数圈复杂度为 (13(。

我认为这是因为我使用了太多的"if"elif"else"语句。

独创功能

def __init__(self, browser='ff', remote_address=None):
"""
remote consle:
dr = PySelenium('RChrome','127.0.0.1:8080')
"""
t1 = time.time()
dc = {'platform': 'ANY', 'browserName': 'chrome', 'version': '', 'javascriptEnabled': True}
dr = None
if remote_address is None:
if browser == "firefox" or browser == "ff":
dr = webdriver.Firefox()
elif browser == "chrome" or browser == "Chrome":
mobile_emulation = {"deviceName": "Galaxy S5"}
option = webdriver.ChromeOptions()
option.add_experimental_option('w3c', False)
option.add_experimental_option('mobileEmulation', mobile_emulation)
dr = webdriver.Chrome(chrome_options=option)
# dr = webdriver.Chrome()
elif browser == "internet explorer" or browser == "ie":
dr = webdriver.Ie()
elif browser == "opera":
dr = webdriver.Opera()
elif browser == "phantomjs":
dr = webdriver.PhantomJS()
elif browser == "edge":
dr = webdriver.Edge()
else:
if browser == "RChrome":
dr = webdriver.Remote(command_executor='http://' + remote_address + '/wd/hub',
desired_capabilities=dc)
elif browser == "RIE":
dc['browserName'] = 'internet explorer'
dr = webdriver.Remote(command_executor='http://' + remote_address + '/wd/hub',
desired_capabilities=dc)
elif browser == "RFirefox":
dc['browserName'] = 'firefox'
dc['marionette'] = False
dr = webdriver.Remote(command_executor='http://' + remote_address + '/wd/hub',
desired_capabilities=dc)

我考虑过使用以下方法,但我觉得它们不适用于我的情况

优化方案 1

def visit_a(self, ...):
...
...
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()

优化方案2

def function_1(...):
...
functions = {'a': function_1,
'b': function_2,
'c': self.method_1, ...}
func = functions[value]
func()

问题:

如何优化">init"函数以避免使用过多的"if"elif"else"语句,并有效降低圈复杂度

如何将各种驱动程序放入字典中;类似的东西?

drivers = {
"firefox": webdriver.Firefox,
"ie": webdriver.Ie,
"opera": webdriver.Opera,
"phantomjs": webdriver.PhantomJS,
"edge": webdriver.Edge,
}
drivers["internet explorer"] = drivers["ie"]
drivers["ff"] = drivers["firefox"]
if remote_address is None:
if browser in ("chrome", "Chrome"):
mobile_emulation = {"deviceName": "Galaxy S5"}
option = webdriver.ChromeOptions()
option.add_experimental_option('w3c', False)
option.add_experimental_option('mobileEmulation', mobile_emulation)
dr = webdriver.Chrome(chrome_options=option)
else:
dr = drivers[browser]()

我认为以下方法应该更灵活? 但性能很差。

brow_drivers = {
("ff", "firefox"): webdriver.Firefox,
("ie", "internet explorer"): webdriver.Ie,
"edge": webdriver.Edge,
"opera": webdriver.Opera,
"phantomjs": webdriver.PhantomJS,
}
if remote_address is None:
if browser in ("chrome", "Chrome"):
mobile_emulation = {"deviceName": "Galaxy S5"}
option = webdriver.ChromeOptions()
option.add_experimental_option('w3c', False)
option.add_experimental_option('mobileEmulation', mobile_emulation)
dr = webdriver.Chrome(chrome_options=option)
else:
dr = next(v for k, v in brow_drivers.items() if browser in k)()

最新更新