Я часто задаюсь вопросом, есть ли лучшая практика для следующей ситуации.
Допустим, я хочу получить доступ к локальным файлам в моем скрипте Python и, следовательно, создать путь к глобальной переменной, указывающий на набор данных.
Теперь я пишу функцию, которая должна иметь переменную пути в качестве аргумента.
Я знаю, что локальная переменная внутри функции затеняет глобальную переменную, но мне просто неприятно писать path=path
.
Кажется, я помню, как видел, как люди просто пишут подчеркивание перед локальной переменной, как в _path=path
.
Это что-то? Есть ли лучшая практика? Как вы называете аргументы функции, которые имеют то же имя, что и глобальный аргумент?
Лучший Джо
Этот вопрос, скорее всего, будет закрыт, поскольку мы не отвечаем на вопросы «лучшей практики». Если не существует письменного стандарта (например, PEP-8), это всего лишь индивидуальное мнение.
Это вопрос мнения. Лично я различаю глобальные переменные, называя их заглавными буквами, учитывая, что имена переменных Python чувствительны к регистру.
Я бы посчитал лучшим вариантом создать global
vars SCREAMING_SNAKE_CASE и/или упаковать их в словарь, если есть какое-либо существенное количество
PATH_DEFAULT = pathlib.Path("/my_path")
CONFIG = {
"path": pathlib.Path("/my_path"),
}
Однако я бы также посчитал плохой практикой устанавливать аргументы по умолчанию таким образом, поскольку они будут оцениваться один раз во время выполнения, в то время как внешние функции могут захотеть установить для них что-то другое... вместо этого (особенно с классом) установите значение по умолчанию на None
, а затем вместо этого посмотрите его во время выполнения if argname is None: ...
например
>>> ARG = 1
>>> def test(arg=ARG):
... print(arg)
...
>>> ARG = 2
>>> test()
1
изменено для поиска значения по умолчанию при каждом вызове
>>> ARG = 1
>>> def test(arg=None):
... if arg is None:
... arg = ARG
... print(arg)
...
>>> test()
1
>>> ARG = 2
>>> test()
2
более полный пример для класса
class Foo:
path_default = pathlib.Path("/my_path")
def __init__(self, path=None, *args):
if path is None:
path = self.path_default
Глобальные переменные обычно должны иметь более описательные имена. Например.
default_path
. Тогда бы вы написалиdef myfunc(path=default_path):
. Также помните, что значение по умолчанию вычисляется при определении функции, а не при ее вызове. Итак, вы уверены, что хотите использовать эту переменную по умолчанию?