Можно ли использовать аргументы функции Python как переменные внутри функции? - PullRequest
0 голосов
/ 17 октября 2019

Я создаю приложение, которое позволяет пользователю отслеживать результаты баскетбола. Например, если команда выполняет штрафной бросок, она нажимает кнопку «Свободный бросок» под заголовком команды, забившей очки, и к отображаемому счету добавляется одно очко. Я использую Python 3.x и хочу знать, смогу ли я написать аргументы функции, которые будут указаны в качестве переменной счета дома или на выезде, а затем обновлены. В настоящее время у меня есть отдельные функции для каждого типа оценки для каждой команды, то есть, по сути, у меня есть дублирующий код за вычетом различий между «дома» и «вне дома». Как дома, так и в гостях сохраняются как глобальные из-за требований для взаимодействия с другим программным обеспечением. Я застрял с 6 полными функциями, или я могу написать 3 и просто указать, какой глобальный я хочу обновить, когда я вызываю функцию? Пример нерабочего кода прилагается

global away_score
away_score = 0

global home_score
home_score = 0

def plus_one(inc_score, inc_frame):
    inc_score += 1
    inc_frame.config(text = inc_score) # this is for interfacing with tkinter

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Поскольку вы используете tkinter, вероятно, лучший способ справиться с этим - использовать переменные tkinter, в данном случае a IntVar:

import tkinter as tk

root = tk.Tk()

away_score = tk.IntVar(value=0)
home_score = tk.IntVar(value=0)

def plus_one(inc_score, inc_frame):
    inc_score.set(inc_score.get()+1)
    inc_frame.config(text = inc_score.get())

away_but = tk.Button(root,text=0)
away_but.config(command=lambda: plus_one(away_score,away_but))
away_but.pack()

root.mainloop()
1 голос
/ 17 октября 2019

Лучше не использовать глобальные переменные и рефакторинг вашего кода, чтобы использовать локальные и словарь или объект для хранения результатов. Но что касается вашего вопроса, вы можете написать что-то вроде этого:

away_score = 0
home_score = 0


def plus_one(inc_frame, add_to_away: bool = False):
    global home_score
    global away_score
    if add_to_away:
        away_score += 1
        inc_score = away_score
    else:
        home_score += 1
        inc_score = home_score
    # inc_frame.config(text = inc_score) # this is for interfacing with tkinter


if __name__ == '__main__':
    plus_one(None, add_to_away=False)
    print(f"home: {home_score}, away: {away_score}")
    plus_one(None, add_to_away=True)
    print(f"home: {home_score}, away: {away_score}")
    plus_one(None, add_to_away=True)
    print(f"home: {home_score}, away: {away_score}")
0 голосов
/ 17 октября 2019

Хотя вы можете изменять глобальные переменные по имени, это, как правило, не то, что вам следует делать.

Однако, если вам действительно нужно сделать эти переменные глобальными (а не, например,, записи в словаре или свойствах класса ) и вы действительно не хотите писать несколько функций обновления, есть решение.

Согласно этому ответу , вы можете изменить словарь, возвращаемый globals, который обновляет пространство имен модуля.

some_variable = None

def update(var, value):
    globals()[var] = value

update('some_variable', 'some value')

print(some_variable) # Output: "some value"

Но если это вообще возможно, вам следуетизбегайте этого - есть много лучших способов написания кода, и это также оставляет место для более захватывающих ошибок.

away_score = 10
update('away_scoer', away_score + 1) # npote the typo
print(away_score) # It's still 10, but there was no error in Python.

update('update', print) # now updating prints instead
update('away_score', 11) # Prints "away_score 11"
print(away_score) # still 10

update('print', function_that_melts_your_computer) # probably a bad idea

У этого также есть более обыденные недостатки, такие как несчастный случай вашего редактора и разрушение завершения кода в некоторыхместа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...