Что такое type=argparse.FileType('rb') в Python

Я смотрю на код Python другого человека:

import argparse
parser = argparse.ArgumentParser(description = "Recover files from an NTFS volume")
parser.add_argument('--mft', type=argparse.FileType('rb'), help='Use given file as MFT')

и нахожу этот аргумент type немного странным для классического разработчика C++/Delphi/C#.

Я могу представить, что такое type=int, но type=argparse.FileType('rb')...?!

Могу предположить, что это своего рода операция "все в одном", которая принимает строковый аргумент и тут же использует его как имя файла для открытия файла на чтение и возвращает свою файловую переменную (дескриптор). Я прав?

Документация не раскрывает механизмы.

Ваша догадка верна. Вы также можете просмотреть исходный код этого типа, чтобы понять, как он работает.

AKX 21.04.2023 19:19

Все это объясняется в документации для FileType argparse . И вы можете посмотреть на реализацию CPython. Это просто тонкая обертка для open

Bakuriu 21.04.2023 19:20
FileType был предоставлен для удобства при написании небольших скриптов, которые принимают входные и выходные файлы. В более новых версиях Python нам рекомендуется открывать файлы в контексте with, поэтому они открыты только до тех пор, пока они нам действительно нужны. Поэтому не стесняйтесь принимать простые имена файлов и открывать/закрывать свои собственные.
hpaulj 21.04.2023 21:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

int и FileType работают одинаково, хотя поначалу это может быть неочевидно. Параметр type= — это просто вызываемый объект, используемый для создания объекта, назначенного параметру. argparse принимает исходный строковый параметр и, если type не является None, вызывает любой объект, чтобы создать значение, присвоенное параметру.

Если вы используете type=int, то называется int(). Но вы можете использовать любой вызываемый объект — argparse все равно — он просто вызывает все, что вы указываете. Вы можете использовать type=open, а затем argparse вызовет open(), и вы получите файл символьного режима, открытый только для чтения.

Вы можете использовать магический метод __call__ в своих собственных классах, чтобы создавать вызываемые экземпляры класса. Вот что здесь происходит. argparse.FileType создает объект, который записывает параметры открытия файла. При вызове с одной строкой через метод __call__ он откроется и вернет файл с этими параметрами. Это похоже на open, но позволяет вам контролировать параметры.

>>> import argparse
>>> import os
>>> os.path.exists("deleteme")
False
>>> file_type = argparse.FileType("wb")
>>> file = file_type("deleteme")
>>> file
<_io.BufferedWriter name='deleteme'>
>>> os.path.exists("deleteme")
True

Спасибо за объяснение. В Python, очевидно, нет разделения задач :)

Paul 21.04.2023 20:08

Интересный момент, но я думаю, что все наоборот. Предположим, у вас есть целочисленный параметр, но пользователь вводит «foo». Вы ожидаете, что анализатор аргументов отобразит сообщение и выйдет из программы без вмешательства другого программиста. То же самое происходит здесь, если указан неверный путь. Возможно, это лучше, чем открывать файл самостоятельно и иметь другой путь ошибки и сообщение об ошибке для одного неверного аргумента и другого. argparse преобразует и проверяет входные параметры в обоих случаях — одна проблема.

tdelaney 22.04.2023 00:07

Вы можете выполнять большую часть проверки входных параметров в анализаторе аргументов с помощью собственных пользовательских классов и функций. Это все в одном месте и имеет общий результат для пользователя.

tdelaney 22.04.2023 00:15

Другие вопросы по теме