如何调用名称以数字分隔的函数?从 t1 到 t20 的示例调用函数 - Python?

Posted

技术标签:

【中文标题】如何调用名称以数字分隔的函数?从 t1 到 t20 的示例调用函数 - Python?【英文标题】:How to call functions with names separated with numbers? Example calling function from t1 to t20 - Python? 【发布时间】:2019-03-27 19:13:08 【问题描述】:
def t17():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
    > table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
    tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
    td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    Clientname.send_keys('Southern')

def t18():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
    > table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
    tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
     td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    Clientname.send_keys('Star')



t3() Thenewway() InspectTickets() newticket() t4() Thenewway() InspectTickets() newticket() t5() Thenewway() I

nspectTickets()

有没有更好的方法来做到这一点?可能有一个循环。蟒蛇新手。提前感谢!

【问题讨论】:

【参考方案1】:

显而易见的解决方案是不定义一堆函数,然后尝试按名称调用它们。这与变量变量名的问题相同:它们导致代码不可维护。几乎总是有更好的整体方法可以让您使用自然语言结构(枚举变量或函数不是自然的)。

如果您坚持拥有大量函数(但您应该重构代码以避免这种情况),您可以将所有函数附加到一个列表中并分别调用它们:

all_funs = []

def foo(args):
    return 'hello'
all_funs.append(foo)

# ...
for fun in all_funs:
    # call the function in a loop
    print(fun())

或者我可以想象一个装饰器将函数收集到一个容器中。

无论哪种方式,您都必须做一些额外的工作,因为您正在尝试在 python 中做一些强有力的事情。这种语言的好处是简单的事情很容易做,所以如果你看到自己做了很多看似不必要的工作,那么你可能在做不必要的工作。退后几步,尝试重写代码以使其更自然。例如,t17t18 仅在传递给 .send_keys 的单个字符串中有所不同。您应该将此作为输入参数并使用相同的功能。我敢肯定,您的 20 个函数中的大多数都可以通过使用一两个底层函数的相同方式进行简化。

【讨论】:

【参考方案2】:

Andras Deak 的回答是完美的。 我提出我的答案只是希望更好地理解您的问题(和问题)。 查看您的功能,您似乎需要通过

获得的单个元素
driver.find_element_by_css_selector

将字符串发送到文本框

如果您只需要将不同的字符串发送到相同的文本框中(在我看来,您在附加的两个示例中指向同一个元素),那么您不需要使用很多功能,正如安德拉斯所说。

只需使用 for 循环:

def t17():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
> table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    # example list:
    key_list = ["Southern", "Star"]
    for key in key_list:
        Clientname.send_keys(key)

当然,如果你需要,别忘了也发送回车键:

# this at top of the file:
from selenium.webdriver.common.keys import Keys
# in yout function:
Clientname.send_keys(Keys.ENTER))

如果你需要等待页面重新加载,那么也可以使用 Selenium 库中的 Wait 方法:

from selenium.webdriver.support import wait as Wait
from selenium.common.exceptions import TimeoutException

try:
    Wait(driver, 10).until(lambda driver: driver.find_element_by_css_selector(Clientbox).is_displayed())
except TimeoutException as e:
    print("here handle your exception", e)

这将等待最多 10 秒(您当然可以自定义它!)然后它会抛出一个 TimeoutException,表明您想要的元素(甚至整个页面)尚未加载

我希望我明白你的问题的重点,这会有所帮助。


如果您绝对需要通过数字(或通过选择的名称)调用函数,那么您可以尝试使用字典,如果您不需要每次都循环整个列出的项目,它提供比列表更多的控制:

def d1():
    return "it's d1"


def d2():
    return "it's d2"


def d3():
    return "it's d3"


def d4():
    return "it's d4"


def fun_switcher(num):
    switcher = 1: d1, 2: d2, 3: d3
    return switcher.get(num, lambda: "fun address error")

# execution example:
if __name__ == "__main__":

    num = 2
    result = fun_switcher(num)
   # remember to call the function, or you will get the function_object as result!
    print(result())

【讨论】:

以上是关于如何调用名称以数字分隔的函数?从 t1 到 t20 的示例调用函数 - Python?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用scanf读取以空格分隔的数字

如何在c#中对以空格分隔的数字进行舍入?

mysql将一个以逗号分隔的数字字符串转出数字

如何从 R 中的 GLM 调用中检索原始变量名称的列表?

如何通过输入定义函数中的变量?

JavaScript——函数定义和调用