Стиль Python

Простой вопрос начинающего:

Я создал небольшой python script для переключения между двумя файлами, которые я использую для тестирования.

Мой вопрос: какой хороший стиль в формате python для следующего кода:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"
config_file = "C:\some\path\file.txt"

shutil.copyfile( remote if( filecmp.cmp(local, config_file ) ) else local, config_file  )

или

shutil.copyfile( remote 
                     if( filecmp.cmp(local, config_file ) ) 
                     else local,
                 config_file  )

или

tocopy = remote if( filecmp.cmp( local, config_file ) ) else local 
shutil.copyfile( tocopy, config_file )

Или что?

Кроме того, каков предпочтительный способ называть var в python для имен с несколькими словами, это "to_copy", "tocopy", "toCopy", "ToCopy"

Спасибо.

Ответ 1

Для условного оператора я бы, вероятно, пошел:

if filecmp.cmp(local, config_file):
    shutil.copyfile(remote, config_file)
else:
    shutil.copyfile(local, config_file)

В этом случае мало нужно использовать встроенный y if x else z, так как окружающий код достаточно прост.

Ответ 2

Из Руководство по стилю Python:

Что касается вывода составного выражения:

Составляющие утверждения (несколько операторов в одной строке), как правило, обескуражены.

Да:

if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

Или для кода, который вы указали, пример Грега является хорошим:

if filecmp.cmp(local, config_file):
    shutil.copyfile(remote, config_file)
else:
    shutil.copyfile(local, config_file)

Скорее не:

if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()

Имена методов и экземпляры переменных

Используйте правила именования функций: в нижнем регистре со словами, разделенными символами подчеркивания, для повышения удобочитаемости.

Обновление: В запросе Oscar также указано, как выглядит его код таким образом.

Ответ 3

Наиболее распространенное имя, которое я видел, - это выделенные слова под индексом to_copy.

Что касается стиля форматирования, я не видел такого соглашения. Я нахожу

source = remote if filecmp.cmp(local, config_file) else local

shutil.copyfile(source, config_file)

чтобы быть наиболее ясным среди ваших вариантов.

И, видя, что все предпочитают разделять, если бы я, по крайней мере, инкапсулировал вызов copyfile, если вы когда-нибудь захотите его изменить:

def copy_to(source, destination):
    shutil.copyfile(source,destination)

if filecmp.cmp(local, config_file):
    copy_to(remote, config_file)
else:
    copy_to(local, config_file)

Ответ 4

Третий вариант выглядит наиболее естественным для меня, хотя использование пробелов в квадратных скобках и лишних круглых скобках противоречит Руководству по стилю Python.

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

Я бы написал его как:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"

destination = r"C:\some\path\file.txt"
source = remote if filecmp.cmp(local, destination) else local

shutil.copyfile(source, destination)

Ответ 6

Как насчет:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"
config_file = "C:\some\path\file.txt"


if filecmp.cmp( local, config_file):
    to_copy = remote
else:
    to_copy = local


shutil.copyfile( to_copy, config_file  )

yikes, это открытое имя открытого экрана выглядит ужасно.