Combobox in tkinter not giving correct .get() value - python
This so weird, like i am trying to use if statement and the selection in combobox to do some specific command and when combobox value is selected to 'full_name' (part of elif) they return an messagebox, that is supposed to be showed only when the first if statement is executed but according to the conditions its supposed to return the elif part but it returns the if part. Is there a mistake in my code? If the Q is unclear please try referring the code or lemme knw :) Thanks in advance.
CODE:
def sp_patient():
#Creating window
sp_pat = Toplevel(update)
sp_pat.title('Choose Patient')
def search():
#Assigning variable to .get()
a = drops.get()
if a == 'id' or 'emirate_id' or 'email_adress' or 'gender' or 'DOB' or 'blood_grp' or 'COVID_test':
#Establishing connection
con = mysql.connect(host='***', user='nihaalnz',
password='****', database='nihaalnztrying')
# Making SQL command
c = con.cursor()
c.execute(f"SELECT * FROM patient_infos where `{a}` = '{e_1.get()}'")
# Executing and saving SQL command
records = c.fetchall()
if records == []:
messagebox.showinfo('Does not exist!','Sorry such patient does not exist')
else:
#Creating window
result_win = Toplevel(sp_pat)
result_win.title('Search result')
index=0
for index,x in enumerate(records):
num=0
for y in x:
lookup_label = Label(result_win,text=y)
lookup_label.grid(row=index+1,column=num)
num += 1
#Closing connection
con.close()
#Creating column header and exit button
l_1 = Label(result_win,text='ID',font=font_text)
l_2 = Label(result_win,text='Full Name',font=font_text)
l_3 = Label(result_win,text='Phone no.',font=font_text)
l_4 = Label(result_win,text='Emirates ID',font=font_text)
l_5 = Label(result_win,text='Email addr.',font=font_text)
l_6 = Label(result_win,text='Gender',font=font_text)
l_7 = Label(result_win,text='DOB',font=font_text)
l_8 = Label(result_win,text='Nationality',font=font_text)
l_9 = Label(result_win,text='Blood group',font=font_text)
l_10 = Label(result_win,text='COVID test',font=font_text)
l_11 = Label(result_win,text='Emergency no.',font=font_text)
btn_ext = Button(result_win,text='Exit',font=font_text,command=result_win.destroy,borderwidth=2,fg='#eb4d4b')
#Placing it in screen
l_1.grid(row=0,column=0,padx=20)
l_2.grid(row=0,column=1,padx=20)
l_3.grid(row=0,column=2,padx=20)
l_4.grid(row=0,column=3,padx=20)
l_5.grid(row=0,column=4,padx=20)
l_6.grid(row=0,column=5,padx=20)
l_7.grid(row=0,column=6,padx=20)
l_8.grid(row=0,column=7,padx=20)
l_9.grid(row=0,column=8,padx=20)
l_10.grid(row=0,column=9,padx=20)
l_11.grid(row=0,column=10,padx=20)
btn_ext.grid(row=index+2,columnspan=11,ipadx=240,sticky=E+W)
elif a == 'full_name' or 'ph_no' or 'nationality' or 'emergency_no':
#Creating window
result_win = Toplevel(sp_pat)
result_win.title('Search result')
#Establishing connection
con = mysql.connect(host='****', user='nihaalnz',
password='*****', database='nihaalnztrying')
# Making SQL command
c = con.cursor()
c.execute(f"SELECT * FROM patient_infos where `{a}` regexp '{e_1.get()}'")
# Executing and saving SQL command
records = c.fetchall()
index=0
for index,x in enumerate(records):
num=0
for y in x:
lookup_label = Label(result_win,text=y)
lookup_label.grid(row=index+1,column=num)
num += 1
#Closing connection
con.close()
#Creating column headers and exit button
l_1 = Label(result_win,text='ID',font=font_text)
l_2 = Label(result_win,text='Full Name',font=font_text)
l_3 = Label(result_win,text='Phone no.',font=font_text)
l_4 = Label(result_win,text='Emirates ID',font=font_text)
l_5 = Label(result_win,text='Email addr.',font=font_text)
l_6 = Label(result_win,text='Gender',font=font_text)
l_7 = Label(result_win,text='DOB',font=font_text)
l_8 = Label(result_win,text='Nationality',font=font_text)
l_9 = Label(result_win,text='Blood group',font=font_text)
l_10 = Label(result_win,text='COVID test',font=font_text)
l_11 = Label(result_win,text='Emergency no.',font=font_text)
btn_ext = Button(result_win,text='Exit',font=font_text,command=result_win.destroy,borderwidth=2,fg='#eb4d4b')
#Placing it on screen
l_1.grid(row=0,column=0,padx=20)
l_2.grid(row=0,column=1,padx=20)
l_3.grid(row=0,column=2,padx=20)
l_4.grid(row=0,column=3,padx=20)
l_5.grid(row=0,column=4,padx=20)
l_6.grid(row=0,column=5,padx=20)
l_7.grid(row=0,column=6,padx=20)
l_8.grid(row=0,column=7,padx=20)
l_9.grid(row=0,column=8,padx=20)
l_10.grid(row=0,column=9,padx=20)
l_11.grid(row=0,column=10,padx=20)
btn_ext.grid(row=index+2,columnspan=11,ipadx=240,sticky=E+W)
elif a == 'Search by...':
#Error message
messagebox.showinfo('No choice given','Please choose a valid option to search by...')
#Defining dropdown and entry box
drops = ttk.Combobox(sp_pat,value=['Search by...','id','full_name','ph_no','emirate_id','email_addr','gender','DOB','nationality','blood_grp','COVID_test','emergency_no'],state='readonly')
print(drops.get())
drops.current(0)
e_1 = Entry(sp_pat)
#Defining Labels and search button
l_sch = Label(sp_pat,text='Search',font=Font(size='20'))
l_id = Label(sp_pat,text='Enter',font=font_text)
bt_db = Button(sp_pat,text='Search',command=search)
#Placing it in screen
drops.grid(row=1,columnspan=3,ipady=5,padx=5,pady=10)
e_1.grid(row=2,column=1,ipady=5,padx=5,pady=5)
l_id.grid(row=2,column=0,padx=5,pady=5)
bt_db.grid(row=3,columnspan=2,padx=5,pady=5,sticky=E+W)
l_sch.grid(row=0,columnspan=2,sticky=E+W,padx=10,pady=10)
The problem is this line:
if a == 'id' or 'emirate_id' or...
This statement always return True. It is evaluating whether a=="id" or emirate_id is True, and a non-empty string always returns True.
You can be explicit and use:
if a == 'id' or a == 'emirate_id' or ...
Or better yet, use keyword in:
if a in ("id", "emirate_id",...)
Related
How to store a lot of data from a treeview in a list, Python
I have the following problem with this part of my code I explain What this function does is get the data from the DB and then fill the Treeview def obtenerDatos(): cursor = conexion.cursor() cursor.execute("SELECT empresas.empresa, picos.pico, tamano_precio.tamano FROM cilindros, empresas, picos, tamano_precio WHERE empresa_id = empresas.id AND pico_id = picos.id AND tamano_id = tamano_precio.id AND jefesf_id =? ORDER BY cilindros.tamano_id ASC", (validarCi,)) datosConsulta = cursor.fetchall() return datosConsulta cursor.close() cursor.execute("SELECT * FROM jefesf WHERE ci =?", (validarCi,)) Then I use an if to check if there are people with that data registered in the DB if cursor.fetchall(): ventana3 = Toplevel() datosConsulta = obtenerDatos() contador = 0 datosJefes = ttk.Treeview(ventana3, columns=("colum1", "colum2")) datosJefes.column("#0", width=80) datosJefes.column("colum1", width=80, anchor=CENTER) datosJefes.column("colum2", width=80, anchor=CENTER) datosJefes.heading("#0", text="Empresa") datosJefes.heading("colum1", text="Pico") datosJefes.heading("colum2", text="TamaƱo") Here I begin to fill the Treview with the data for listado in datosConsulta: datosJefes.insert("", "end", text=listado[0], values=(listado[1], listado[2])) datosJefes.pack() This is where I have the problem, what I want to do is to be able to select records from the treview and that those records are saved in a multilist and print them to me by console, but I don't know how def SeleccinarRegistro(): global listaCilin global dato1 global dato2 listaCilin = [] dato = datosJefes.item(datosJefes.selection()) datos = list(dato.values()) dato1 = datos[0] dato2 = datos[2][0] dato3 = datos[2][1] I tried with a While loop but it generates an infinite loop, and my idea was every time I press the button the loop runs and saves the elements in the list while SeleccinarRegistro: listaCilin.append([dato1, dato2, dato3, validarCi]) print("Empresa: ", dato1) print("Pico: ", dato2) print("Tamano: ", dato3) print(listaCilin) Button(ventana3, text="Seleccionar", command=SeleccinarRegistro).pack()
PYTHON SQLITE selecting multiple where conditions that may or may not exist
Working on some code that uses pysimplegui as the UI and SQlite for the data sorting. I'm using SQLite's execute function to select data based on input from the user in the UI through variables. For example user wants to search for part name they input all or part of the name into the box, hit the search button which then runs my "parts_search" method, which will then only filter the result based on part name. OR the user enters information in multiple boxes which then filters based on the boxes that have information. This here is runnable code provided you add a file base1.db in the same folder location as the script itself import PySimpleGUI as sg import os.path import sqlite3 # sql var c = None conn = None setup = None # list var parts = [] def sql(): global setup conn_sql() c.execute("""CREATE TABLE IF NOT EXISTS parts (part_name TEXT, part_number TEXT, part_series TEXT, part_size INTEGER, job_type TEXT)""") conn.commit() if conn: conn.close() def conn_sql(): global c global conn # SQL connection var if os.path.isfile('./base1.db'): conn = sqlite3.connect('base1.db') c = conn.cursor() def main_gui_parts(): global parts layout = [[sg.Text('Part Name: '), sg.Input(size=(20, 1), key='-PName-'), sg.Text('Part Series:'), sg.Input(size=(10, 1), key='-PSeries-')], [sg.Text('Part Number:'), sg.Input(size=(20, 1), key='-PNumber-'), sg.Text('Part Size:'), sg.Input(size=(10, 1), key='-PSize-')], [sg.Checkbox('Fit', key='-PFit-'), sg.Checkbox('Weld', key='-PWeld-'), sg.Checkbox('Assemble', key='-PAssemble-'), sg.Button('Search', key='-PSearch-')], [sg.Listbox(parts, size=(58, 10), key='-PParts-')], [sg.Button('Back', key='-PBack-')]] window = sg.Window('parts list', layout, grab_anywhere=True) sql() while True: event, values = window.read() if event == 'Close' or event == sg.WIN_CLOSED: break # PART WINDOW part_name = values['-PName-'] part_series = values['-PSeries-'] part_number = values['-PNumber-'] part_size = values['-PSize-'] fit = values['-PFit-'] weld = values['-PWeld-'] assemble = values['-PAssemble-'] if event == '-PSearch-': print('search parts') part_search(part_name, part_series, part_number, part_size, fit, weld, assemble) if event == '-PBack-': break window.close() def part_search(part_name, part_series, part_number, part_size, fit, weld, assemble): global parts conn_sql() filter_original = """SELECT * FROM parts WHERE """ filter = filter_original if part_name: print('part name: ' + part_name) if filter == filter_original: filter += """part_name LIKE ? """ else: filter += """AND part_name LIKE ? """ if part_series: print('part series: ' + part_series) if filter == filter_original: filter += """part_series=(?) """ else: filter += """AND part_series=(?) """ if part_number: print('part number: ' + part_number) if filter == filter_original: filter += """part_number LIKE ? """ ### DONT USE LIKE??? else: filter += """AND part_number LIKE ? """ ### DONT USE LIKE??? if part_size: print('part size: ' + part_size) if filter == filter_original: filter += """part_size=(?) """ else: filter += """AND part_size=(?) """ if fit: print('job type: ' + str(fit)) if filter == filter_original: filter += """job_type = fit """ else: filter += """AND job_type = fit """ if weld: print('job type: ' + str(weld)) if filter == filter_original: filter += """job_type = weld """ else: filter += """AND job_type = weld """ if assemble: print('job type: ' + str(assemble)) if filter == filter_original: filter += """job_type = assemble""" else: filter += """AND job_type = assemble""" print(filter) #if filter != filter_original: #c.execute(filter, ()) #else: #c.execute("""SELECT * FROM parts""") main_gui_parts() THE PROBLEM: The commented code at the bottom is where I'm having trouble figuring out (in the "part_search" method). I don't use all of the variables all the time. Only filter with the variables provided by the user. which means the tuple should only have the variables which was input by the user. If all the variables were used this is what it would look like. c.execute(filter, (part_name, part_series, part_number, part_size, fit, weld, assemble)) but more often than not only some of those variable will have been used and may need to look like this instead. c.execute(filter, (part_name, part_series, weld)) Somehow I need the variables here to be removeable(for lack of better word) I've been learning a lot about SQLite but I could be seeing tunnel vision and can't think of a different way to go about this.
Probably the easiest way to deal with this is to put all the filter conditions and values into lists, and then only add a WHERE clause if the length of the filters list is non-zero. For example: query = """SELECT * FROM parts""" filters = [] values = [] if part_name: filters.append("""part_name LIKE ?""") values.append(part_name) ... if len(filters): query += ' WHERE ' + ' AND '.join(filters) c.execute(query, tuple(values)) Note: should your filters ever include OR conditions, you need to parenthesise them when building the query to ensure correct operation i.e. query += ' WHERE (' + ') AND ('.join(filters) + ')'
Get all data API when inputs are empty
I created my first API where I can get data from my tables in Bigquery. I can get all the data I need based on the 2 inputs below, but I am also trying to get the whole table when the inputs are empty, which I cannot do. Thanks for your help #app.route("/tracking", methods=['GET']) def tracking_data(): haulier_id_tracking = request.args.get('haulier_id_tracking') month_tracking = request.args.get('month_tracking') query_job = bq_client.query(""" WITH t AS ( SELECT * FROM mart.monthly_vehicle_stats WHERE dt_fr_month = '{month_tracking}-01' AND (haulier_id_tracking = '{haulier_id_tracking}') SELECT TO_JSON_STRING(STRUCT(ARRAY_AGG(STRUCT(dt_fr_month, haulier_id_tracking, vehicle_id , nb_days_tracked, data_access, date_first_camp, invoiced)) AS data)) json FROM t """.format(month_tracking = month_tracking, haulier_id_tracking = haulier_id_tracking)) for row in query_job: return json.loads(row["json"])
You can remove the where clause when the input is empty like this: #app.route("/tracking", methods=['GET']) def tracking_data(): haulier_id_tracking = request.args.get('haulier_id_tracking') month_tracking = request.args.get('month_tracking') where_clause = '' if haulier_id_tracking != '' and month_tracking != '': where_clause = f"WHERE dt_fr_month = '{month_tracking}-01' AND (haulier_id_tracking = '{haulier_id_tracking}'" query_job = bq_client.query(f""" WITH t AS ( SELECT * FROM mart.monthly_vehicle_stats {where_clause}) SELECT TO_JSON_STRING(STRUCT(ARRAY_AGG(STRUCT(dt_fr_month, haulier_id_tracking, vehicle_id , nb_days_tracked, data_access, date_first_camp, invoiced)) AS data)) json FROM t """) for row in query_job: return json.loads(row["json"])
How to to save one document based on an if statement in Python?
I am trying to save a document based on a if statement. Here I am creating radiobuttons: info = ["Option 1", "Option 2", "Option 3"] vars = [] for idx,i in enumerate(info): var = IntVar(value=0) vars.append(var) lblOption = Label(main,text=i) btnYes = Radiobutton(main, text="Yes", variable=var, value=2) btnNo = Radiobutton(main, text="No", variable=var, value=1) btnNa = Radiobutton(main, text="N/A", variable=var,value=0) lblOption.grid(column=4,row=idx, sticky = W) btnYes.grid(column=1,row=idx) btnNo.grid(column=2,row=idx) btnNa.grid(column=3,row=idx) Here I am creating a document document = Document() #add table table = document.add_table(1, 4) #style table table.style = 'Table Grid' #populate header row heading_cells = table.rows[0].cells heading_cells[0].text = "Options" heading_cells[1].text = "Yes" heading_cells[2].text = "No" heading_cells[3].text = "N/a" for idx, item in enumerate(vars): cells = table.add_row().cells cells[0].text = info[idx] # gets the option name val = item.get() #radiobutton value if val == 2: # checks if yes cells[1].text = "*" elif val == 1: # checks if no cells[2].text = "*" elif val == 0: # checks if N/A cells[3].text = "*" #save doc document.save("test.docx") Work behind the scenes: Out of the 3 radio-button Yes, No, N/a.. Only one can be chosen. Next, when pressed a button save.. it creates a table in docx, Options is in row 0 appending down along with selected values of Yes, no & N/a. As an example: Options Yes No N/a Option 1 * Option 2 * Option 3 * My Problem: I can simply press save and it saves the file as test.docx. Now, I am trying to figure out how to save the file as Failed.docx The Failed.docx will only be created if one or more out of all the options has a no value selected. As an example below, this would be saved as Test.docx, because not a single Option has a no value selected: Options Yes No N/a Option 1 * Option 2 * Option 3 * An example below, this would be saved as Failed.docx, because no option has been selected for one of the options on the left. As an example: Options Yes No N/a Option 1 * Option 2 * Option 3 * Here is what I have tried so far: for x in cells[2].text: if "*" in x: print("True") else: print("False") This detects * within the cell[2] (This is row 2 linked to No value). And if a 'no' value has been selected it prints out true but also prints out false As an example: Options Yes No N/a Option 1 * Option 2 * Option 3 * Output of the for loop : False True False But if it detects False and True both files will be saved. I am totally confused where to go from here..
Question: The 'Failed.docx' will only be created if one or more out of all the options has a no value selected. This can be rephrased to: if any option has NO You have build a list of Boolean from the condition value == NO, like [False, True, False] Built-in - any any(iterable) Return True if any element of the iterable is true. If the iterable is empty, return False. YES = 2; NO = 1; NA = 0 print(vars) if any([v.get() == NO for v in vars]): print('Failed.docx') else: print('test.docx') Output: [2, 0, 2] test.docx [2, 1, 2] Failed.docx
Try the following: for x in cells[2].text: if "*" in x: print("Failed.docx") elif "*" not in x: print("Test.docx") this checks if any "*" is inside your no row, if it exists save as Failed.docx if not save as Test.docx
Trying to avoid creating numerous variables in python
I am new to python and I have a lot of variables I will be using in this script. These variables are being used to grab data from each column in an uploaded file. I have added variables for each object type and I have about 12 more object types to add. Isn't there a better way I can do this? I have the file it's grabbing data from here: Action Object Solution ID hostgroup_name alias Add Host Group ISD-CR ISD-CR_database ISD-CR Database Add Service ISD-CR ISD-CR_database Update Service Group ISD-CR ISD-CR Database Delete Service ISD-CR ISD-CR_database Here is the script I have so far. from pynag import Model from pynag.Parsers import config def addObject(): # Add hostgroup object hg = Model.Hostgroup() hg.set_filename('/etc/nagios/objects/solution1/{0}.cfg'.format(target_hostgroup_name)) # Adding all attributes to allow any to be added if needed hg.hostgroup_name = target_hostgroup_name hg.alias = target_alias hg.members = target_members hg.hostgroup_members = target_hostgroup_members hg.notes = target_notes hg.notes_url = target_notes_url hg.action_url = target_action_url # Save hg.save() print "hostgroup added" # Add service object s = Model.Service() s.set_filename('/etc/nagios/objects/solution1/{0}.cfg'.format(target_hostgroup_name)) # Adding all attributes to allow any to be added if needed s.host_name = target_host_name s.hostgroup_name = target_hostgroup_name s.service_description = target_service_description s.display_name = target_display_name s.servicegroups = target_servicegroups s.is_volatile = target_is_volatile s.check_command = target_check_command s.initial_state = target_initial_state s.max_check_attempts = target_max_check_attempts s.check_interval = target_check_interval s.retry_interval = target_retry_interval s.active_checks_enabled = target_active_checks_enabled s.passive_checks_enabled = target_passive_checks_enabled s.check_period = target_check_period s.obsess_over_service = target_obsess_over_service s.check_freshness = target_check_freshness s.freshness_threshold = target_freshness_threshold s.event_handler = target_event_handler s.event_handler_enabled = target_event_handler_enabled s.low_flap_threshold = target_low_flap_threshold s.high_flap_threshold = target_high_flap_threshold s.flap_detection_enabled = target_flap_detection_enabled s.flap_detection_options = target_flap_detection_options s.process_perf_data = target_process_perf_data s.retain_status_information = target_retain_status_information s.retain_nonstatus_information = target_retain_nonstatus_information s.notification_interval = target_notification_interval s.first_notification_delay = target_first_notification_delay s.notification_period = target_notification_period s.notification_options = target_notification_options s.notification_enabled = target_notifications_enabled s.contacts = target_contacts s.contact_groups = target_contact_groups s.stalking_options = target_stalking_options s.notes = target_notes s.notes_url = target_notes_url s.action_url = target_action_url s.icon_image = target_icon_image s.icon_image_alt = target_icon_image_alt # Save s.save() print "service added" # Add servicegroup object sg = Model.Servicegroup() sg.set_filename('/etc/nagios/objects/solution1/{0}.cfg'.format(target_hostgroup_name)) # Adding all attributes to allow any to be added if needed sg.servicegroup_name = target_servicegroup_name sg.alias = target_alias sg.members = target_members sg.servicegroup_members = target_servicegroup_members sg.notes = target_notes sg.notes_url = target_notes_url sg.action_url = '/etc/nagios/objects/solution1/{0}.cfg'.format(target_hostgroup_name) # Save sg.save() print "service group added" try: current_file = csv.reader(open(input_file, "rb"), delimiter='\t') except: logging.error('No such file or directory. Please try again') else: for line in current_file: for row in current_file: target_hostgroup_name = row[3] target_alias = row[4] target_members = row[5] target_hostgroup_members = row[6] target_notes = row[7] target_notes_url = row[8] target_action_url = row[9] target_host_name = row[10] target_service_description = row[11] target_display_name = row[12] target_servicegroups = row[13] target_is_volatile = row[14] target_check_command = row[15] target_initial_state = row[16] target_max_check_attempts = row[17] target_check_interval = row[18] target_retry_interval = row[19] target_active_checks_enabled = row[20] target_passive_checks_enabled = row[21] target_check_period = row[22] target_obsess_over_service = row[23] target_check_freshness = row[24] target_freshness_threshold = row[25] target_event_handler = row[26] target_event_handler_enabled = row[27] target_low_flap_threshold = row[28] target_high_flap_threshold = row[29] target_flap_detection_enabled = row[30] target_flap_detection_options = row[31] target_process_perf_data = row[32] target_retain_status_information = row[33] target_retain_nonstatus_information = row[34] target_notification_interval = row[35] target_first_notification_delay = row[36] target_notification_period = row[37] target_notification_options = row[38] target_notifications_enabled = row[39] target_contacts = row[40] target_contact_groups = row[41] target_stalking_options = row[42] target_icon_image = row[43] target_icon_image_alt = row[44] target_servicegroup_name = row[45] target_servicegroup_members = row[46]
If the values are in the same order every time, you could consider populating a list that you then could loop over, instead of doing it one by one. For the "target" portion of your script, you could nest another loop for range(3, 46) as well, and pass the index to your list instead of manually for every number from 3 to 46.
Why do you do this? for line in current_file: for row in current_file: If the first row is a header row and you're skipping it on purpose, you can use a DictReader instead. It doesn't look like you'll be able to do much to clean this up, but you could factor out each "section" into its own function: def save_hostgroup(name, alias, members, hostgroup_members, notes, notes_url, action_url): hg = Model.Hostgroup() hg.set_filename('/etc/nagios/objects/solution1/{0}.cfg'.format(target_hostgroup_name)) # Adding all attributes to allow any to be added if needed hg.hostgroup_name = target_hostgroup_name hg.alias = target_alias hg.members = target_members hg.hostgroup_members = target_hostgroup_members hg.notes = target_notes hg.notes_url = target_notes_url hg.action_url = target_action_url hg.save()
Behind the scenes all the member names of an object are stored in a dict. You can access this dict with vars(obj) or obj.__dict__. You can then use the update method of the dict to add a set of names to your object. eg. class SomeClass: def __str__(self): return "SomeClass({})".format( ", ".join( "{}={!r}".format(key, value) for key, value in self.__dict__.items() ) ) __repr__ = __str__ target_names = ['var_a', 'var_b', 'var_c'] target_values = [1, 2, 3] target = dict(zip(target_names, target_values)) assert target == {'var_a': 1, 'var_b': 2, 'var_c': 3} s = SomeClass() vars(s).update(target) assert hasattr(s, 'var_a') assert s.var_a == 1 print(s) # prints SomeClass(var_c=3, var_a=1, var_b=2)