如何将 2 个函数中的 1 个参数分别传递给 1 个函数?

How to pass 1 argument each from 2 functions into 1 function?

我试图了解如何以及为什么我没有看到这个特定问题的任何答案。

我有两个 functions 每个都有一个参数 path

def check_sbb_name(path):
    if path is None:
        DeltaZero_Selenium_Manager.test_sbb_name_textfield(path)
        return path
    else:
        call = sbb_manager_sql()
        name = call.get_new_sbb_name()
        DeltaZero_Selenium_Manager.test_sbb_name_textfield(name)
        
        create_new_sbb("", name)
def check_sites_for_sbb(path):
    if path is None:
        DeltaZero_Selenium_Manager.test_site_combo_options_alternative_overview(path)
    else:
        call = sbb_manager_sql()
        site = call.connect_site()
        DeltaZero_Selenium_Manager.test_site_combo_options_alternative_overview(site)
        
        create_new_sbb(site, "")

忽略这些 functions 实际上所做的一切,因为一切都完美无缺,直到 我想将 name & site 传递给以下 create_new_sbb 函数

def create_new_sbb(site_name, sbb_name):
    mycursor.execute("INSERT INTO sbb_data (site, name, is_deleted) VALUES (%s, %s, %s)",
                         (site_name, sbb_name, 0))
    db.commit()

所以我想同时将这些参数传递给create_new_sbb,而不是在每个函数上调用create_new_sbb

Note that create_new_sbb is located in another file

MySql数据库中的结果:

显然我希望 sitename 在同一行
所以只有当两个参数都以某种方式传递时才执行 create_new_sbb

非常感谢任何帮助!!!

首先,请考虑给出您将使用这些函数的示例代码,以便更清楚地说明它们的用法。

对于解决方案本身,我将提出使用 this:

的解决方案
def func1(value):
    print_two_values(value1 = value)

def func2(value):
    print_two_values(value2 = value)


def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(value1="",value2="")
def print_two_values(value1="", value2=""):
    if value1:
        print_two_values.value1 = value1
    
    if value2:
        print_two_values.value2 = value2

    if print_two_values.value1 and print_two_values.value2:
        print(print_two_values.value1, print_two_values.value2)
        print_two_values.value1 = ""
        print_two_values.value2 = ""

func1("Hello")
func2("World")

func2("1")
func1("Test")

func1("This will not")
func1("This will")
func2("be shown")

这将导致此输出

Hello World
Test 1
This will be shown

最后,将其应用到您的代码中,您的 create_new_sbb 看起来像

@static_vars(site_name="",sbb_name="")
def create_new_sbb(site_name="", sbb_name=""):
    if site_name:
        create_new_sbb.site_name = site_name

    if sbb_name:
        create_new_sbb.sbb_name = sbb_name

    if create_new_sbb.site_name and create_new_sbb.sbb_name:
        mycursor.execute("INSERT INTO sbb_data (site, name, is_deleted) VALUES (%s, %s, %s)",
                            (create_new_sbb.site_name, create_new_sbb.sbb_name, 0))
        db.commit()
        create_new_sbb.site_name = ""
        create_new_sbb.sbb_name = ""

然后要设置 site_name 你只需调用 create_new_sbb(site_name="site name") 而对于 sbb_name 你只需调用 create_new_sbb(sbb_name="sbb name").

这个解决方案有一些局限性,如前面的输出所示,如果您不注意顺序,您可能会丢失数据,这在多线程场景中很容易发生,在这种情况下,您有很多潜在的避免在此函数中造成瓶颈的解决方案(而不是 N 变量,创建一个缓冲区数组,其中你有 N_thread * N_variable 作为每个变量的索引)但这超出了这个答案的范围。

我在这里假设你总是调用check_sbb_namecheck_sites_for_sbb成对使用相同的路径。我会使用:

cur_path = None
cur_name = None
cur_site = None

def check_sbb_name(path):
    ...    
    register_name(path, name)      # only register

def check_sites_for_sbb(path):
    ...
    register_site(path, site)      # only register

def register_name(path, name):
    if (path == cur_path) and (cur_site is not None): # other element already registered
        create_new_sbb(cur_site, name)                # ok, we can insert
    else:
        cur_path = path                               # register for this path
        cur_site = None
    cur_name = name

def register_site(path, site):
    if (path == cur_path) and (cur_name is not None):
        create_new_sbb(site, cur_name)
    else:
        cur_path = path
        cur_name = None
    cur_site = site

重要的部分是注册元素,只有当你有一对时才写入数据库。可以使用替代方法(使用相同的原则),例如,如果您总是先调用 check_sbb_name,那么 register_name 将始终注册 cur_name(不需要路径),而 register_site 将总是打电话给 create_new_bb。或者...