【问题标题】:How to pass 1 argument each from 2 functions into 1 function?如何将 1 个参数从 2 个函数传递到 1 个函数?
【发布时间】:2021-05-11 11:59:30
【问题描述】:

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

我有两个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 实际所做的一切,因为一切正常,直到 我想将namesite 传递给以下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

注意create_new_sbb 位于另一个文件中

MySql DB 中的结果:

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

非常感谢任何帮助!!!

【问题讨论】:

  • “在每个函数上调用create_new_sbb”是什么意思?另外,您需要minimal, reproducible example
  • 你的意思是“如果两个参数都通过了,只执行create_new_sbb”?如果您尝试在没有所需输入的情况下调用该函数,您将收到 TypeError。如果在未定义它们时将它们传递为 None ,那么,在调用函数之前检查 None 。
  • 我需要将我的参数传递给“create_new_sbb”,为此,您必须调用它对吗?
  • @Reti43 - 是的,我知道,但我想知道是否有解决方法,如果没有。我该如何更改才能使其正常工作?
  • 您确实在代码中执行create_new_sbb("", name)。显然这会导致不良结果,所以不要这样做。仅当两个参数都不是空字符串时才调用您的函数。这是一个简单的条件检查。

标签: python function parameter-passing


【解决方案1】:

首先,请考虑提供示例代码来说明您将如何使用这些函数,以便更清楚地了解它们的用法。

对于解决方案本身,我将提出使用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 作为每个变量的索引)但这超出了此答案的范围。

【讨论】:

    【解决方案2】:

    我在这里假设您总是以相同的路径成对调用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。或者……

    【讨论】:

    • 这几乎可以工作,但我设法解决了剩下的问题!谢谢!
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2012-03-04
    相关资源
    最近更新 更多