У меня возникают проблемы с информацией о печати, которая вводится из файла yaml с помощью PyYAML. Я пытаюсь уменьшить количество строк, не влияя на функциональность. В некоторых записях вывод должен быть добавлен к файлу, в других - к stdout.повторное открытие sys.stdout после его закрытия с помощью оператора
Сначала я использовал это несколько раз в моей функции ProcessData:
if logName:
fp = open(logName, 'a')
else:
fp = sys.stdout
print(........, file=fp)
print(........, file=fp)
if logName:
fp.close()
Это работало, но имеет недостатки, не используя с заявления, когда что-то идет не так.
Реальная проблема заключается не в сложных операторах печати, но я
1) не хочет, чтобы дублировать код при печати в файл или sys.stdout
2) хочет использовать с заявление так, что файлы будут закрыты, если есть ошибки печати
3) существует несколько таких блоков, я не хочу, чтобы вызвать другую функцию для каждого из них, и таким образом предотвращая дублирование
кода Тогда я попытался это :
def processData(yamlData, logName=None):
......
with open(logName, 'a') if logName else sys.stdout as fp:
print(........, file=fp)
print(........, file=fp)
.....
with open(logName, 'a') if logName else sys.stdout as fp:
print(........, file=fp)
print(........, file=fp)
Если нет имени журнала, это приведет к ошибке «ValueError: операция ввода-вывода в закрытом файле». Любые предложения о том, как заставить это работать без оригинального дублирования? Можно ли повторно открыть sys.stdout?
Вместо печати вы можете использовать регистратор. Это лучшая практика. –
Спасибо, я посмотрю. Некоторые полезные пакеты, так мало времени ... – Brad
@Brad Смотреть дальше! Введите _Python_, первый язык и стандартную библиотеку, где _ «должен быть один, а желательно, только один - единственный очевидный способ сделать это!» _ Если в стандартной библиотеке есть некоторые функциональные возможности, вы можете поспорить, что им было сложно сделать это типичный вариант использования. –