Saya telah mencoba memahami bagaimana dan mengapa saya belum melihat jawaban untuk pertanyaan khusus ini.

Saya memiliki dua functions masing-masing memiliki argumen 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, "")

Abaikan saja semua yang dilakukan functions ini, karena semuanya bekerja dengan sempurna sampai Saya ingin meneruskan name & site ke fungsi create_new_sbb berikut

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()

Jadi saya ingin menyampaikan argumen ini ke create_new_sbb secara bersamaan, daripada memanggil create_new_sbb pada setiap fungsi

Perhatikan bahwa create_new_sbb terletak di file lain

Hasil di DB MySql:

enter image description here

Saya ingin site dan name pada baris yang sama jelas
Jadi hanya jalankan create_new_sbb ketika kedua argumen telah dilewati.

Apapun bantuannya sangat dihargai!!!

0
Herker 11 Mei 2021, 14:59

2 jawaban

Jawaban Terbaik

Saya akan berasumsi di sini bahwa Anda selalu memanggil check_sbb_name dan check_sites_for_sbb berpasangan dengan jalur yang sama. saya akan menggunakan:

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

Bagian yang penting adalah mendaftarkan elemen dan hanya menulis ke database ketika Anda memiliki pasangan. Metode alternatif (menggunakan prinsip yang sama) dapat digunakan jika misalnya Anda selalu memanggil check_sbb_name terlebih dahulu, maka register_name akan selalu mendaftar cur_name (tidak perlu jalur) dan register_site akan selalu panggil create_new_bb. Atau...

0
Serge Ballesta 11 Mei 2021, 13:10

Pertama, pertimbangkan untuk memberikan contoh kode penggunaan yang akan Anda buat dari fungsi-fungsi ini untuk memperjelas penggunaannya.

Untuk solusi itu sendiri, saya akan mengusulkan solusi saya yang menggunakan ini:

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, printTwoValues.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")

Yang kemudian akan menghasilkan output ini

Hello World
Test 1
This will be shown

Terakhir, menerapkan ini ke kode Anda, create_new_sbb Anda akan terlihat seperti

@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 = ""

Dan kemudian untuk menyetel site_name Anda cukup memanggil create_new_sbb(site_name="site name") dan untuk sbb_name Anda cukup memanggil create_new_sbb(sbb_name="sbb name").

Solusi ini memiliki beberapa batasan, seperti yang ditunjukkan pada output sebelumnya jika Anda tidak berhati-hati dengan urutannya, Anda dapat kehilangan data, yang dapat dengan mudah terjadi dalam skenario multi-utas, dalam hal ini Anda memiliki sejumlah solusi potensial untuk menghindari pembuatan bottleneck dalam fungsi ini (alih-alih variabel N, buat array buffer di mana Anda memiliki N_thread * N_variable sebagai indeks untuk setiap variabel) tetapi ini di luar cakupan jawaban ini.

1
Sandro Massa 11 Mei 2021, 15:44