Есть ли способ упростить этот код Python? - PullRequest
0 голосов
/ 30 октября 2018

Я все еще нахожусь на стадии "любая технология, достаточно продвинутая ...", чтобы учиться программировать. Этот код кажется неуклюжим, и при необходимости его сложно обновить. Есть ли лучший способ сделать это? Для меня это выглядит совершенно помешанным, но это работает ... так что?

Он берет переменную из радиуса TKinter 1-16 и использует ее для выбора переменной ect grade1. Переменная grade1 затем ссылается на имена листов на gspread.

def go():
    subject = v.get()
    if  subject == 1:
        subject = grade1
    elif  subject == 2:
        subject = grade2    
    elif  subject == 3:
        subject = grade3
    elif  subject == 4:
        subject = grade4  
    elif  subject == 5:
        subject = grade5
    elif  subject == 6:
        subject = grade6
    elif  subject == 7:
        subject = grade7
    elif  subject == 8:
        subject = grade8
    elif  subject == 9:
        subject = grade9
    elif  subject == 10:
        subject = grade10    
    elif  subject == 11:
        subject = grade11
    elif  subject == 12:
        subject = grade12 
    elif  subject == 13:
        subject = grade13
    elif  subject == 14:
        subject = grade14
    elif  subject == 15:
        subject = grade15
    elif  subject == 16:
        subject = grade16

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

Или используйте словарь:

d={1:grade1,2:grade2 ... 16:grade16}
print(d[v.get()])

Вы получите желаемую оценку.

У вас должен быть словарь с ключами всех возможных значений v.get() и значениями оценок, которые вы хотите для каждого ключа, так что вы получите ключ v.get() в словаре, а затем получите его значение, используя d[v.get()], теперь вы получили желаемую оценку.

0 голосов
/ 30 октября 2018

Вместо определения 16 отдельных переменных сорта 1 ... сорта 16, вы можете сохранить их в списке, например, grades=[grade1,...,grade16], а затем задать тему как subject = grades[v.get()-1]

0 голосов
/ 30 октября 2018

Есть несколько способов обойти это.

# 1. Using the `list` data type
def go():
    grade_list = [grade1, grade2, ... grade16]
    subject = [grade_list[v.get() - 1]]


# 2. Using the `eval` 
def go():
       subject = v.get()
       if subject in range(1, 17):
           subject = eval("grade" + str(subject))

Первый метод считается лучшим кодом. Тем не менее, есть еще один способ использования eval ключевое слово. Он обрабатывает код внутри как выражение. Так как изменяется только числовая часть переменной. Тем не менее, eval не лучший способ, который я рекомендую. Подробнее см. На этой странице Почему использование 'eval' является плохой практикой?

0 голосов
/ 30 октября 2018

Не сохраняйте 16 различных переменных для grade**! Используйте один список:

grades = [1, 2, 3, ...]  # or whatever your values are

Тогда все, что вам нужно сделать, это:

subject = grades[v.get() - 1]
...