Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2018 16:28:29

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

PEP 8

Добрый день.
Задача создать каталог и скопировать в него файл. Запускаться этот код будет несколько раз, поэтому нужно перехватить ошибку FileExistsError. Пишу код и получаю от PyCharm'a предупреждение о запрете использования голого except'a

 import shutil
import os
try:
    os.mkdir('123')
except: FileExistsError            #Do not use bare except
shutil.copy('my_file.mp3', '.' + '\\' + '123' + '\\')
Единственный вариант, приходящий мне в голову, как изменить код, чтобы не было этой ошибки:
 try:
    os.mkdir('123')
    shutil.copy('my_file.mp3', '.' + '\\' + '123' + '\\')
except FileExistsError:            
    shutil.copy('my_file.mp3', '.' + '\\' + '123' + '\\')
Но писать одну и туже команду дважды в коде, наверно, тоже не лучшая практика.
Как более правильно сделать?
И еще вопрос по поводу записи пути к файлу. Использование кучи “+” как у меня тоже наверняка
плохой вариант. Как лучше склеить путь?


Отредактировано SomethingButNotNickName (Март 4, 2018 16:36:39)

Офлайн

#2 Март 4, 2018 21:45:03

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

эээээ

  import shutil
import os
try:
    os.mkdir('123')
except FileExistsError:            # двоеточие как бы не на том месте
    shutil.copy('my_file.mp3', '.' + '\\' + '123' + '\\')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 4, 2018 21:48:52

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

SomethingButNotNickName
Как лучше склеить путь?
эээ а зачем так делать если можно просто
 shutil.copy('my_file.mp3', '.\\123\\')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Март 4, 2018 21:51:37

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

А PEP8 вам говорил что запись вида

 try:
    some_code
except:
    some_code
лучше заменить на хотя бы
 try:
    some_code
except Exception:
    some_code
что бы не перехватывать абсолютно все исключения, включая прерывание с клавиатуры, системный выход и тп



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Март 4, 2018 21:56:41

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

SomethingButNotNickName
Как лучше склеить путь?
если у вас есть переменная с частью пути, то можно использовать шаблоны строк, например
 s = 'will'
'/some/path/{}/be/here'.format(s)
если есть список строк которые нужно объединить в путь то так
import os
s = 'sparta'
vars = ['this', 'is', s, '!!1']
os.sep.join(vars)
обычная конкатенация строк, в общем то, не преступление, использовать можно



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Март 5, 2018 13:09:03

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

PEP 8

Спасибо, с двоеточием действительно все элементарно)

Офлайн

#7 Март 5, 2018 13:32:35

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

PEP 8

JOHN_16
эээээ

 try:
    os.mkdir('123')
except FileExistsError:            # двоеточие как бы не на том месте
    shutil.copy('my_file.mp3', '.' + '\\' + '123' + '\\')
Стоп, в таком случае копирование выполнится только если вызовется ошибка FileExistsError.
А мне нужно чтобы копирование выполнялось в любом случае.
Т.е. каталог создается единожды, при попытке скопировать первый файл.
А потом при попытке скопировать второй и последующие файлы мы пропускаем создание каталога и сразу копируем файл. По сути блок except должен быть пустым. И именно на это ругается PyCharm.

Отредактировано SomethingButNotNickName (Март 5, 2018 13:33:07)

Офлайн

#8 Март 5, 2018 13:40:35

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

Тогда try finaly использовтаь надо. Это тоже элементарно - надо всего лишь обратиться в документацию или учебник/книгу



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Март 5, 2018 13:59:28

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

PEP 8

Для примера воспользуется делением и соответствующей ошибкой:
Команда печати “Hello world” это команда которую я хочу выполнить в любом случае (как копирование в предыдущем примере).

 a = 0
b = 5
try:
    c = b / a
except ZeroDivisionError:
finally:
    print('Hello world')

В результате перехватили ошибку деления на ноль, и мой print()сработает в любом случае, но такой код не будет работать по причине пустого except'a. И мы снова упираемся в: либо дублирование команды print()
либо переставления двоеточия. И finally нам ничем не помог.

Отредактировано SomethingButNotNickName (Март 5, 2018 14:00:22)

Офлайн

#10 Март 5, 2018 14:54:20

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

PEP 8

In [1]: try:
...: 1 / 0
...: except ZeroDivisionError:
...: pass
...: finally:
...: print('Oops')
...:
Oops
SomethingButNotNickName
Ваша проблема в том что вы думаете что знаете питон, поэтому разбрасываетесь такими словечками с привкусом пафоса
SomethingButNotNickName
И finally нам ничем не помог.
не зная как делать правильно



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version