Другой полезный плагин для разработки C cscope Так же, как Ctags позволяет Вам перейти к определениям, переходам Cscope к вызов функции.
, Если у Вас есть cscope в Вашем ~/bin/каталог, добавьте следующее к своему .vimrc и используйте g^] для движения в функцию вызова (см.: помогите cscope).
if has("cscope")
set csprg=~/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
endif
Почти забыл... Так же, как ctags - необходимо генерировать (и периодически обновлять), база данных. Я использую следующий сценарий
select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files
, Где 'select_files' является другим сценарием, который извлекает список C и заголовочных файлов от Make-файла. Таким образом, я индексирую только файлы, на самом деле используемые проектом.
Это действительно вопрос семантики. Что означает foo = latestpdf (d)
, означает ?
Разве вполне разумно, что нет последнего файла? Тогда конечно, просто верните None.
Вы ожидаете, что всегда найдете последний файл? Поднимите исключение. И да, можно повторно создать более подходящее исключение.
Если это просто общая функция, которая должна применяться к любому каталогу, я бы сделал первое и вернул None. Если каталог, например, предназначен для использования в качестве определенного каталога данных, содержащего известный набор файлов приложения, я бы вызвал исключение.
Я обычно предпочитаю обрабатывать исключения внутренне (т.е. try / except внутри вызываемой функции, возможно, возвращая None), потому что python динамически типизируется. В общем, я так или иначе считаю это суждением, но в динамически типизированном языке есть небольшие факторы, которые склоняют чашу весов в пользу отказа от передачи исключения вызывающей стороне:
если val равно None
немного проще, чем , за исключением ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Серьезно, я ненавижу напоминать о вводе из django.core. исключения импортируют ObjectDoesNotExist
в начало всех моих файлов django, чтобы справиться с действительно распространенным вариантом использования. В статически типизированном мире позвольте редактору сделать это за вас. Честно говоря, это всегда суждение, и описываемая вами ситуация, когда вызываемая функция получает ошибку, которую она не может помочь, является ошибкой. отличный повод для повторного создания значимого исключения. У вас есть точная правильная идея, но если вы не исключение, оно предоставит более значимую информацию в трассировке стека, чем
AttributeError: 'NoneType' object has no attribute 'foo'
, что в девяти случаях из десяти - это то, что увидит вызывающий, если вы вернете необработанное None, не не беспокойтесь.
(Все это заставляет меня желать, чтобы исключения python имели атрибуты cause
по умолчанию, как в java,
В общем, я бы сказал, что должно быть создано исключение, если произошло что-то катастрофическое, из которого невозможно восстановить (т.е. ваша функция имеет дело с каким-то интернет-ресурсом, к которому невозможно подключиться), и вы должен возвращать None, если ваша функция действительно должна что-то возвращать, но ничего не следует возвращать (например, «None», если ваша функция пытается сопоставить подстроку в строке).
Я хотел бы сделать пару предложений, прежде чем отвечать на ваш вопрос, так как он может ответить на ваш вопрос.
latestpdf
мало что значит для всех, но просмотр вашей функции latestpdf ()
получает последнюю версию pdf. Я бы посоветовал вам назвать его getLatestPdfFromFolder (папка)
. Как только я это сделал, стало ясно, что он должен возвращать .. Если нет PDF-файла, вызовет исключение. Но подождите ...
for folder in folders:
try:
latest = getLatestPdfFromFolder(folder)
results = somefuc(latest)
except IOError: pass
Надеюсь, это поможет!