Colin Warn
Colin Warn

Reputation: 411

String Interpolation of a Method Call Question

I'm not sure how to quite describe this problem, so pardon my subpar description.

In my code there are four separate methods are numbered from 0 to 4. I'd like to string interpolate the method call. Here's the code I have.

for i in range(0,4):
    form.lineEditCh_3.insert('10')
    print(form.lineEditCh_3.text())
    DAC_Communication.set_voltage(channel=4, line_edit=form.lineEditCh_3, plain_text=form.plainTextEditCh_3)
    form.buttonCh_3.click()

I'd like to be able to do something like:

for i in range(0,4):
        form.lineEditCh_{i}.insert('10')
        print(form.lineEditCh_{i}.text())
        DAC_Communication.set_voltage(channel={i+1}, line_edit=form.lineEditCh_{i}, plain_text=form.plainTextEditCh_{i})
        form.buttonCh_{i}.click()

How exactly would I go about doing this?

Upvotes: 1

Views: 121

Answers (1)

Mustafa Aydın
Mustafa Aydın

Reputation: 18315

Keeping them in lists and iterating in parallel might be better but you can use getattr:

for i in range(4):
    # getting variables of interest with `getattr`
    lineEditCh_i = getattr(form, f"lineEditCh_{i}")
    plainTextEditCh_i = getattr(form, f"plainTextEditCh_{i}")
    buttonCh_i = getattr(form, f"buttonCh_{i}")

    # using them
    lineEditCh_i.insert("10")
    print(lineEditCh_i.text())
    
    DAC_Communication.set_voltage(channel=i+1,
                                  line_edit=lineEditCh_i,
                                  plain_text=plainTextEditCh_i)
    buttonCh_i.click()

The approach with lists is:

lineEditChs = [form.lineEditCh_0, form.lineEditCh_1, ...]
plainTextEditChs = [form.plainTextEditCh_0, form.plainTextEditCh_1, ...]
buttonChs = [form.buttonCh_0, form.buttonCh_1, ...]

then you'd be writing:

for i, (lineEditCh_i, plainTextEditCh_i, buttonCh_i) in enumerate(
                                                           zip(lineEditChs,
                                                               plainTextEditChs, 
                                                               buttonChs)):
    lineEditCh_i.insert("10")
    print(lineEditCh_i.text())
    
    DAC_Communication.set_voltage(channel=i+1,
                                  line_edit=lineEditCh_i,
                                  plain_text=plainTextEditCh_i)
    buttonCh_i.click()

Upvotes: 2

Related Questions