如何将 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数据库中的结果:
显然我希望 site
和 name
在同一行
所以只有当两个参数都以某种方式传递时才执行 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_name
和check_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
。或者...
我试图了解如何以及为什么我没有看到这个特定问题的任何答案。
我有两个 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数据库中的结果:
显然我希望 site
和 name
在同一行
所以只有当两个参数都以某种方式传递时才执行 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_name
和check_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
。或者...