Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

argparse.FileType opens a file and never closes it #58032

Closed
DavidLayton mannequin opened this issue Jan 19, 2012 · 27 comments · Fixed by #124664
Closed

argparse.FileType opens a file and never closes it #58032

DavidLayton mannequin opened this issue Jan 19, 2012 · 27 comments · Fixed by #124664
Assignees
Labels
stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error

Comments

@DavidLayton
Copy link
Mannequin

DavidLayton mannequin commented Jan 19, 2012

BPO 13824
Nosy @merwok, @mitar, @matrixise, @MojoVampire, @remilapeyre, @septatrix
Files
  • patch_3.diff
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2012-01-19.12:25:39.321>
    labels = ['type-bug', 'library']
    title = 'argparse.FileType opens a file and never closes it'
    updated_at = <Date 2021-07-25.09:27:11.812>
    user = 'https://bugs.python.org/DavidLayton'

    bugs.python.org fields:

    activity = <Date 2021-07-25.09:27:11.812>
    actor = 'Nils Kattenbeck'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Library (Lib)']
    creation = <Date 2012-01-19.12:25:39.321>
    creator = 'David.Layton'
    dependencies = []
    files = ['31852']
    hgrepos = []
    issue_num = 13824
    keywords = ['patch']
    message_count = 15.0
    messages = ['151615', '152518', '152519', '152530', '166068', '198336', '198376', '215298', '341670', '341761', '341764', '341852', '342153', '342503', '398184']
    nosy_count = 13.0
    nosy_names = ['bethard', 'eric.araujo', 'mitar', 'Paolo.Elvati', 'manveru', 'Stefan.Pfeiffer', 'paul.j3', 'David.Layton', 'matrixise', 'josh.r', 'remi.lapeyre', 'sebix', 'Nils Kattenbeck']
    pr_nums = []
    priority = 'normal'
    resolution = None
    stage = None
    status = 'open'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue13824'
    versions = ['Python 2.7']

    Linked PRs

    @DavidLayton
    Copy link
    Mannequin Author

    DavidLayton mannequin commented Jan 19, 2012

    argparse.FileType.__call__ opens the specified file and returns it. This is well documented as an anit-idiom in http://docs.python.org/howto/doanddont.html#exceptions.

    "...a serious problem — due to implementation details in CPython, the file would not be closed when an exception is raised until the exception handler finishes; and, worse, in other implementations (e.g., Jython) it might not be closed at all regardless of whether or not an exception is raised."

    Disregarding the above, handling a file which may or may not have been opened depending the users input requires a bit of boilerplate code compared to the usual with-open idiom.

    Additionally, there is no way to prevent FileType from clobbering an existing file when used with write mode.

    Given these issues and others, it seems to me that the usefulness of FileType is outweighed by propensity to encourage bad coding. Perhaps, it would be best if FileType (or some replacement) simply checked that the file exists (when such a check is appropriate), it can be opened in the specified mode, and, curry the call to open (i.e. return lambda: open(string, self._mode, self._bufsize))

    @DavidLayton DavidLayton mannequin added stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error labels Jan 19, 2012
    @merwok
    Copy link
    Member

    merwok commented Feb 3, 2012

    Additionally, there is no way to prevent FileType from clobbering an existing file when used with write mode.

    I think this deserves its own feature request: now that Python 3.3 has an “exclusive create” mode, argparse.FileType could gain support for it. Would you open that request?

    Given these issues and others,

    We have one issue and one missing feature; what are the other issues?

    it seems to me that the usefulness of FileType is outweighed by propensity to encourage bad coding.

    I think the problem is not as bad as you paint it. A great number of unclosed file handles may cause problem to some OSes, but that’s it. On the plus side, the fact that argparse accepts for its type argument any callable that can check and convert a string input is simple, clean and works. FileType is needed.

    In packaging/distutils2 for example we have similar functions that return an open file object and never close it: the responsibility is at a higher level. Other packaging code calling these functions does so in a with statement. It is not evil by nature.

    The problem here is that FileType may return stdin or stdout, so we can’t just always close the file object (or maybe we can, say using an atexit handler?).

    Perhaps, it would be best if FileType (or some replacement) simply checked that the file exists

    But then you’d run into race conditions. The only sure was to say if a file can be opened is to open it.

    @merwok merwok changed the title argparse.FileType opens a file without excepting resposibility for closing it argparse.FileType opens a file and never closes it Feb 3, 2012
    @merwok
    Copy link
    Member

    merwok commented Feb 3, 2012

    s/sure was/sure way/

    @DavidLayton
    Copy link
    Mannequin Author

    DavidLayton mannequin commented Feb 3, 2012

    Eric,

    But then you’d run into race conditions. The only sure was to say if a file can be opened is to open it.

    I think you misunderstand me. I am NOT suggesting that you open and close the file. I am saying that you should not open it in the first place.

    If I cannot open the file at the point in my program where I actually want to open it, then fine, I can decide, in my own code, what to do.

    I think the problem is not as bad as you paint it. A great number of unclosed file handles may cause problem to some OSes, but that’s it. On the plus side, the fact that argparse accepts for its type argument any callable that can check and convert a string input is simple, clean and works. FileType is needed.

    Causing a problem on some OSes and not others is worse than causing a problem on all OSes as it increases the likelihood of buggy code passing tests and moving to production.

    I think argparse is wonderful; I just think that by having FileType not open the file, the number of it's use cases is increased. As it stands now, I would prefer the just pass the argument as a string argument and handling the opening myself unless:

    1. I wanted my program to open the file at the very beginning of the program (where one traditionally handles arg parsing)
    2. I wanted to exit on the first, and only, attempt to open the file
    3. I really did not care if the file closed properly--which, granted, is often the case with tiny scripts

    The moment any of these is not true due to a change in requirements, I will have to refactor my code to use a filename arg. Where as if I start out with a bog-standard filename and open it myself, I can easily add the behaviour I want. I just don't see FileType as a big convenience. However, I do see that changing this would break backwards compatibility and would not want to see that happen. Perhaps a new FileNameType that does some basic, perhaps, optional checks would have wider use-cases.

    I hope this helps.

    David Layton

    @bethard
    Copy link
    Mannequin

    bethard mannequin commented Jul 21, 2012

    So I generally agree that FileType is not what you want for anything but quick scripts that can afford to either leave a file open or to close stdin and/or stdout. However, quick scripts are an important use case for argparse, so I don't think we should get rid of FileType.

    What should definitely happen:

    • Someone should add some documentation explaining the risks of using FileType (e.g. forgetting to close the file, or closing stdin/stdout when you didn't mean to).

    What could potentially happen if someone really wanted it:

    • Someone could create a "safe" replacement, e.g. a FileOpenerType that returns an object with open() and close() methods that do the right things (or whatever API makes sense).

    @paulj3
    Copy link
    Mannequin

    paulj3 mannequin commented Sep 23, 2013

    In this patch I implement a FileContext class. It differs from FileType
    in 2 key areas:

    • it returns a 'partial(open, filename, ...)'
    • it wraps '-' (stdin/out) in a dummy context protecting the file from closure.

    The resulting argument is meant to be used as:

        with args.input() as f:
            f.read()
            etc

    The file is not opened until value is called, and it will be closed after the block. stdin/out can also be used in this context, but without closing.

    The signature for this class is the same as for FileType, with one added parameter, 'style'. (alternative name suggestions welcomed).

    class argparse.FileContext(mode='r', bufsize=-1, encoding=None, errors=None, style='delayed')

    The default behavior, "style='delayed'", is as described above.

    "style='evaluate'" immediately calls the partial, returning an opened file. This is essentially the same as FileType, except for the stdin/out context wrapping.

    "style='osaccess'", adds os.acccess testing to determine whether the 'delayed' file can be read or written. It attempts to catch the same sort of OS errors that FileType would, but without actually opening or creating the file.

    Most of the added tests in test_argparse.py copy the FileType tests. I had to make some modifications to the testing framework to handle the
    added levels of indirection.

    I have not written the documentation changes yet.

    A sample use case is:

        import argparse, sys
        p = argparse.ArgumentParser()
        p.add_argument('-d','--delayed', type=argparse.FileContext('r'))
        p.add_argument('-e','--evaluated', type=argparse.FileContext('r', style='evaluate'))
        p.add_argument('-t','--test', dest='delayed', type=argparse.FileContext('r', style='osaccess'))
        p.add_argument('-o','--output', type=argparse.FileContext('w', style='osaccess'), default='-')
        p.add_argument('--unused', type=argparse.FileContext('w', style='osaccess'),help='unused write file')
        args = p.parse_args()
    
        with args.output() as o:
            if args.delayed:
                with args.delayed() as f:
                    print(f.read(), file=o)
            if args.evaluated:
                with args.evaluated as f:
                    print(f.read(), file=o)
        # f and o will be closed if regular files
        # but not if stdin/out
        # the file referenced by args.unused will not be created

    @paulj3
    Copy link
    Mannequin

    paulj3 mannequin commented Sep 25, 2013

    An alternative way to delay the file opening, is to return an instance that has a filename attribute, and has an open method. This can be compactly added to the FileContext that I defined in the previous patch. The FileContext provides the _ostest function (testing using os.access), and wrapper for stdin/out.

        class FileOpener(argparse.FileContext):
            # delayed FileType; alt to use of partial()
            # sample use:
            # with args.input.open() as f: f.read()
            def __call__(self, string):
                string = self._ostest(string)
                self.filename = string
                return self
            def open(self):
                return self.__delay_call__(self.filename)()
            file =  property(open, None, None, 'open file property')

    @paulj3
    Copy link
    Mannequin

    paulj3 mannequin commented Apr 1, 2014

    From http://bugs.python.org/issue14156
    "argparse.FileType for '-' doesn't work for a mode of 'rb'"

    I learned that 'stdin/out' can be embedded in an 'open' by using the 'fileno()' and 'closefd=False' (so it isn't closed at the end of open).

    With this, the dummy file context that I implemented in the previous patch, could be replaced with:

    partial(open, sys.stdin.fileno(), mode=self._mode,..., closefd=False)
    

    However, as Steven Bethard wrote in the earlier issue, setting up tests when stdin/out will be redirected is not a trivial problem. So I don't yet have a testable patch.

    ---------------
    And just for the record, the 'osaccess' testing that I wrote earlier, probably should also test that proposed output file string is not already a directory.

    @mitar
    Copy link
    Mannequin

    mitar mannequin commented May 7, 2019

    Why not make FileType instance also a context manager, so you could do something like:

    with arguments.input as f:
       assert arguments.input is f

    For backwards compatibility, FileType would open eagerly as now, but it would be closed at exit from context manager.

    We should just make sure we do not close stdout/stderr.

    @MojoVampire
    Copy link
    Mannequin

    MojoVampire mannequin commented May 7, 2019

    Mitar: argparse.FileType's __call__ (which is what "parses" the argument) returns whatever open (aka io.open) returns. Basically, post-parsing, there is nothing about the result of FileType that distinguishes it from a manually opened file (or when '-' is passed, from stdin/stdout). So it's already possible to do what you describe, simply by doing:

    parser = argparse.ArgumentParser()
    parser.add_argument('input', type=argparse.FileType())
    arguments = parser.parse_args()
    
    with arguments.input as f:
       assert arguments.input is f

    That already "open[s] eagerly as now, but it would be closed at exit from context manager."

    The original report did not like that you couldn't prevent clobbering of an existing file in write mode (no longer true, since you can pass a mode of 'x' just like you can with open), and did not like that the result of parsing was implicitly opened immediately without being controllable *immediately* via a context manager.

    The only real solutions to that problem are either:

    1. Making FileType (or a replacement) that is lazier in some way.
    2. Making the argument namespace itself support context management

    The proposal to check validity and return a curried call to open is problematic given the TOCTOU issues, but a curried version that performs little or no checks up front, but performs argparse style clean exits if the deferred open fails would be reasonable.

    The alternative would be to integrate more heavily with the argument namespace, such that you could write code like:

    with parser.parse_args() as arguments:

    and in that scenario, the files would be opened immediately and stored on the namespace, but either only FileType, or any type result supporting context management, would be bulk __enter__-ed and bulk __exit__-ed upon exiting the with block.

    As is, a user could do most of this with contextlib.ExitStack, but it's more to reimplement (and tricky to get right, and would still rely on argparse to clean up files 1 through n-1 if opening file n fails for whatever reason before parsing completes).

    @remilapeyre
    Copy link
    Mannequin

    remilapeyre mannequin commented May 7, 2019

    For information, bpo-33927 is related. I removed one of the FileType from json.tool argument parser to work around this behavior (https://github.com/python/cpython/pull/7865/files#diff-e94945dd18482591faf1e294b029a6afR44).

    If paul.j3 does not have his patch anymore I volunteer to implement option 1 to have a better alternative in the stdlib.

    @mitar
    Copy link
    Mannequin

    mitar mannequin commented May 8, 2019

    So it's already possible to do what you describe, simply by doing:

    I think there is an edge case here if a stdin/stdout is opened? It would get closed at exist from the context, no?

    So I suggest that a slight extension of what open otherwise returns is returned which make sure context manager applies only to non-stdin/stdout handles.

    @paulj3
    Copy link
    Mannequin

    paulj3 mannequin commented May 11, 2019

    While I continue to follow argparse issues, I'm not doing development (with my own repository, etc).

    I haven't revisited the issue since 2013, and don't know that much more about Python file handling. Occasionally 'FileType' issues come up on StackOverflow, and my most common suggestion is accept a string, and open the file yourself.

    In writing a solution, keep backward compatibility foremost in mind. We don't want to mess things up for existing code. And keep FileType simple, consistent with Steven's original intent - as a tool for simple input/output scripts.

    As for the idea of

    2 - Making the argument namespace itself support context management

    someone could experiment with a new Namespace class with the proper enter/exit methods. The use of a custom Namespace class is documented

    https://docs.python.org/3/library/argparse.html#the-namespace-object

    So the idea can be implemented and thoroughly tested without altering the default Namespace class and its use. (With one caution, subparsers won't use this custom class.)

    @matrixise
    Copy link
    Member

    Hi,

    Are you interested to write test cases? They could be useful for the fix.

    Thank you

    @Septatrix
    Copy link
    Mannequin

    Septatrix mannequin commented Jul 25, 2021

    A good alternative would be to use pathlib.Path. The only downside would be that one has to manually handle - but besides that it solves most problems.

    Still the fact that file descriptors are kept open should be added as a warning to the docs

    @merwok
    Copy link
    Member

    merwok commented Jul 6, 2022

    A good alternative would be to use pathlib.Path.

    How so? FileType lets you specify that the argument should be readable or writable, so this would be a loss of functionality.

    @serhiy-storchaka
    Copy link
    Member

    The current design has too many flaws. Open files are leaked if argparse itself fails or the user code fails or quits before it has chance to close all files. Output files are always rewritten in case of error. Input files can remain open for too long time and consume the limited resource of file descriptors. And solving it in the user code is difficult even if we ignore errors that can occur during parsing (see for example the pickletools CLI #85567).

    All solutions (making file opening lazy (and maybe explicit) or making the parser or the namespace object a context manager) require changing the user code. Minimizing changes in the user code increases chance of writing user code that does not do all thing properly.

    On other hand, explicit opening and closing files is not much more complex that proper use of FileType or its replacement. The only non-trivial thing that FileType does in comparison with the plain open() is returning the standard stream (depending on mode) if the argument is "-". We can provide an utility function for this, although the code is only non-trivial because it is general, for any concrete mode string it is simpler.

    I propose to deprecate argparse.FileType. Its existence in the stdlib implies that it is a preferable way to handle file arguments, but it is not so. You have less issues if you do not use it.

    @gvanrossum
    Copy link
    Member

    +1. Well argued. I’m not even sure we need a helper for ‘-‘ ; that API would be a bit convoluted, since closing stdin is fraught.

    serhiy-storchaka added a commit to serhiy-storchaka/cpython that referenced this issue Jan 2, 2024
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    serhiy-storchaka added a commit that referenced this issue Jan 10, 2024
    …-113649)
    
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    Dev-Mw added a commit to Dev-Mw/cpython that referenced this issue Jan 21, 2024
    * gh-111926: Set up basic sementics of weakref API for freethreading (gh-113621)
    
    ---------
    
    Co-authored-by: Sam Gross <colesbury@gmail.com>
    
    * gh-113603: Compiler no longer tries to maintain the no-empty-block invariant (#113636)
    
    * gh-113258: Write frozen modules to the build tree on Windows (GH-113303)
    
    This ensures the source directory is not modified at build time, and different builds (e.g. different versions or GIL vs no-GIL) do not have conflicts.
    
    * Document the `co_lines` method on code objects (#113682)
    
    Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
    
    * gh-52161: Enhance Cmd support for docstrings (#110987)
    
    In `cmd.Cmd.do_help` call `inspect.cleandoc()`,
    to clean indentation and remove leading/trailing empty
    lines from a dosctring before printing.
    
    * GH-113689: Fix broken handling of invalid executors (GH-113694)
    
    * gh-113696: Docs: Annotate PyObject_CallOneArg and PyObject_CallNoArgs as returning a strong reference (#113697)
    
    * gh-113569: Display calls in Mock.assert_has_calls failure when empty (GH-113573)
    
    * gh-113538: Don't error in stream reader protocol callback when task is cancelled (#113690)
    
    * GH-113225: Speed up `pathlib.Path.glob()` (#113226)
    
    Use `os.DirEntry.path` as the string representation of child paths, unless
    the parent path is empty, in which case we use the entry `name`.
    
    * gh-112532: Isolate abandoned segments by interpreter (#113717)
    
    * gh-112532: Isolate abandoned segments by interpreter
    
    Mimalloc segments are data structures that contain memory allocations along
    with metadata. Each segment is "owned" by a thread. When a thread exits,
    it abandons its segments to a global pool to be later reclaimed by other
    threads. This changes the pool to be per-interpreter instead of process-wide.
    
    This will be important for when we use mimalloc to find GC objects in the
    `--disable-gil` builds. We want heaps to only store Python objects from a
    single interpreter. Absent this change, the abandoning and reclaiming process
    could break this isolation.
    
    * Add missing '&_mi_abandoned_default' to 'tld_empty'
    
    * gh-113320: Reduce the number of dangerous `getattr()` calls when constructing protocol classes (#113401)
    
    - Only attempt to figure out whether protocol members are "method members" or not if the class is marked as a runtime protocol. This information is irrelevant for non-runtime protocols; we can safely skip the risky introspection for them.
    - Only do the risky getattr() calls in one place (the runtime_checkable class decorator), rather than in three places (_ProtocolMeta.__init__, _ProtocolMeta.__instancecheck__ and _ProtocolMeta.__subclasscheck__). This reduces the number of locations in typing.py where the risky introspection could go wrong.
    - For runtime protocols, if determining whether a protocol member is callable or not fails, give a better error message. I think it's reasonable for us to reject runtime protocols that have members which raise strange exceptions when you try to access them. PEP-544 clearly states that all protocol member must be callable for issubclass() calls against the protocol to be valid -- and if a member raises when we try to access it, there's no way for us to figure out whether it's a callable member or not!
    
    * GH-113486: Do not emit spurious PY_UNWIND events for optimized calls to classes. (GH-113680)
    
    * gh-113703: Correctly identify incomplete f-strings in the codeop module (#113709)
    
    * gh-101100: Fix Sphinx warnings for 2.6 deprecations and removals (#113725)
    
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
    
    * gh-80532: Do not set ipv6type when cross-compiling (#17956)
    
    Co-authored-by: Xavier de Gaye <xdegaye@gmail.com>
    
    * gh-101100: Fix Sphinx warnings in `library/pyclbr.rst` (#113739)
    
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    
    * gh-112532: Tag mimalloc heaps and pages (#113742)
    
    * gh-112532: Tag mimalloc heaps and pages
    
    Mimalloc pages are data structures that contain contiguous allocations
    of the same block size. Note that they are distinct from operating
    system pages. Mimalloc pages are contained in segments.
    
    When a thread exits, it abandons any segments and contained pages that
    have live allocations. These segments and pages may be later reclaimed
    by another thread. To support GC and certain thread-safety guarantees in
    free-threaded builds, we want pages to only be reclaimed by the
    corresponding heap in the claimant thread. For example, we want pages
    containing GC objects to only be claimed by GC heaps.
    
    This allows heaps and pages to be tagged with an integer tag that is
    used to ensure that abandoned pages are only claimed by heaps with the
    same tag. Heaps can be initialized with a tag (0-15); any page allocated
    by that heap copies the corresponding tag.
    
    * Fix conversion warning
    
    * gh-113688: Split up gcmodule.c (gh-113715)
    
    This splits part of Modules/gcmodule.c of into Python/gc.c, which
    now contains the core garbage collection implementation. The Python
    module remain in the Modules/gcmodule.c file.
    
    * GH-113568: Stop raising auditing events from pathlib ABCs (#113571)
    
    Raise auditing events in `pathlib.Path.glob()`, `rglob()` and `walk()`,
    but not in `pathlib._abc.PathBase` methods. Also move generation of a
    deprecation warning into `pathlib.Path` so it gets the right stack level.
    
    * gh-85567: Fix resouce warnings in pickle and pickletools CLIs (GH-113618)
    
    Explicitly open and close files instead of using FileType.
    
    * gh-113360: Fix the documentation of module's attribute __test__ (GH-113393)
    
    It can only be a dict since Python 2.4.
    
    * GH-113568: Stop raising deprecation warnings from pathlib ABCs (#113757)
    
    * gh-113750: Fix object resurrection in free-threaded builds (gh-113751)
    
    gh-113750: Fix object resurrection on free-threaded builds
    
    This avoids the undesired re-initializing of fields like `ob_gc_bits`,
    `ob_mutex`, and `ob_tid` when an object is resurrected due to its
    finalizer being called.
    
    This change has no effect on the default (with GIL) build.
    
    * gh-113729: Fix IDLE's Help -> "IDLE Help" menu bug in 3.12.1 and 3.11.7 (#113731)
    
    Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
    
    * gh-113537: support loads str in plistlib.loads (#113582)
    
    Add support for loading XML plists from a string value instead of a only bytes value.
    
    * gh-111488: Changed error message in case of no 'in' keyword after 'for' in cmp (#113656)
    
    * gh-107901: synthetic jumps which are not at end of loop no longer check the eval breaker (#113721)
    
    * GH-113528: pathlib ABC tests: add repr to dummy path classes. (#113777)
    
    The `DummyPurePath` and `DummyPath` test classes are simple subclasses of
    `PurePathBase` and `PathBase`. This commit adds `__repr__()` methods to the
    dummy classes, which makes debugging test failures less painful.
    
    * GH-113528: Split up pathlib tests for invalid basenames. (#113776)
    
    Split test cases for invalid names into dedicated test methods. This will
    make it easier to refactor tests for invalid name handling in ABCs later.
    
    No change of coverage, just a change of test suite organisation.
    
    * GH-113528: Slightly improve `pathlib.Path.glob()` tests for symlink loop handling (#113763)
    
    Slightly improve `pathlib.Path.glob()` tests for symlink loop handling
    
    When filtering results, ignore paths with more than one `linkD/` segment,
    rather than all paths below the first `linkD/` segment. This allows us
    to test that other paths under `linkD/` are correctly returned.
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase.name` (#113531)
    
    Replace usage of `_from_parsed_parts()` with `with_segments()` in
    `with_name()`, and take a similar approach in `name` for consistency's
    sake.
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase.parent` (#113530)
    
    Replace use of `_from_parsed_parts()` with `with_segments()`, and move
    assignments to `_drv`, `_root`, _tail_cached` and `_str` slots into
    `PurePath`.
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (#113529)
    
    Replace use of `_from_parsed_parts()` with `with_segments()` in
    `PurePathBase.relative_to()`, and move the assignment of `_drv`, `_root`
    and `_tail_cached` slots into `PurePath.relative_to()`.
    
    * gh-89532: Remove LibreSSL workarounds (#28728)
    
    Remove LibreSSL specific workaround ifdefs from `_ssl.c` and delete the non-version-specific `_ssl_data.h` file (relevant for OpenSSL < 1.1.1, which we no longer support per PEP 644).
    
    Co-authored-by: Christian Heimes <christian@python.org>
    Co-authored-by: Gregory P. Smith <greg@krypto.org>
    
    * gh-112795: Allow `/` folder in a zipfile (#112932)
    
    Allow extraction (no-op) of a "/" folder in a zipfile, they are commonly added by some archive creation tools.
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    Co-authored-by: Gregory P. Smith <greg@krypto.org>
    
    * gh-73965: New environment variable PYTHON_HISTORY (#13208)
    
    It can be used to set the location of a .python_history file
    
    ---------
    
    Co-authored-by: Levi Sabah <0xl3vi@gmail.com>
    Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
    
    * gh-73965: Move PYTHON_HISTORY into the correct usage section (#113798)
    
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * gh-80109: Fix io.TextIOWrapper dropping the internal buffer during write() (GH-22535)
    
    io.TextIOWrapper was dropping the internal decoding buffer
    during read() and write() calls.
    
    * gh-74678: Increase base64 test coverage (GH-21913)
    
    Ensure the character y is disallowed within an Ascii85 5-tuple.
    
    Co-authored-by: Lee Cannon <leecannon@leecannon.xyz>
    
    * gh-110721: Remove unused code from suggestions.c after moving PyErr_Display to use the traceback module (#113712)
    
    * gh-113391: fix outdated PyObject_HasAttr docs (#113420)
    
    After #53875: PyObject_HasAttr is not an equivalent of hasattr.
    PyObject_HasAttrWithError is; it already has the note.
    
    * gh-113787: Fix refleaks in test_capi (gh-113816)
    
    Fix refleaks and a typo.
    
    * gh-113755: Fully adapt gcmodule.c to Argument Clinic (#113756)
    
    Adapt the following functions to Argument Clinic:
    
    - gc.set_threshold
    - gc.get_referrers
    - gc.get_referents
    
    * Minor algebraic simplification for the totient() recipe (gh-113822)
    
    * GH-113528: Move a few misplaced pathlib tests (#113527)
    
    `PurePathBase` does not define `__eq__()`, and so we have no business checking path equality in `test_eq_common` and `test_equivalences`. The tests only pass at the moment because we define the test class's `__eq__()` for use elsewhere.
    
    Also move `test_parse_path_common` into the main pathlib test suite. It exercises a private `_parse_path()` method that will be moved to `PurePath` soon.
    
    Lastly move a couple more tests concerned with optimisations and path normalisation.
    
    * gh-113688: fix dtrace build on Solaris (#113814)
    
    (the gcmodule -> gc refactoring broke it)
    
    * GH-113528: Speed up pathlib ABC tests. (#113788)
    
    - Add `__slots__` to dummy path classes.
    - Return namedtuple rather than `os.stat_result` from `DummyPath.stat()`.
    - Reduce maximum symlink count in `DummyPathWithSymlinks.resolve()`.
    
    * gh-113791: Expose CLOCK_MONOTONIC_RAW_APPROX and CLOCK_UPTIME_RAW_APROX on macOS in the time module (#113792)
    
    * GH-111693: Propagate correct asyncio.CancelledError instance out of asyncio.Condition.wait() (#111694)
    
    Also fix a race condition in `asyncio.Semaphore.acquire()` when cancelled.
    
    * gh-113827: Move Windows frozen modules directory to allow PGO builds (GH-113828)
    
    * gh-113027: Fix test_variable_tzname in test_email (#113821)
    
    Determine the support of the Kyiv timezone by checking the result of
    astimezone() which uses the system tz database and not the one
    populated by zoneinfo.
    
    * readme: fix displaying issue of command (#113719)
    
    Avoid line break in command as this causes displaying issues on GH.
    
    * gh-112806: Remove unused function warnings during mimalloc build on Solaris (#112807)
    
    * gh-112808: Fix mimalloc build on Solaris (#112809)
    
    * gh-112087: Update list.{pop,clear,reverse,remove} to use CS (gh-113764)
    
    * Docs: Link tokens in the format string grammars (#108184)
    
    Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
    Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
    
    * gh-113692: skip a test if multiprocessing isn't available. (GH-113704)
    
    * gh-101100: Fix Sphinx warnings for 2.6 port-specific deprecations (#113752)
    
    * gh-113842: Add missing error check for PyIter_Next() in Python/symtable.c (GH-113843)
    
    * gh-87868: Sort and remove duplicates in getenvironment() (GH-102731)
    
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
    Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
    
    * gh-103092: Test _ctypes type hierarchy and features (#113727)
    
    Test the following features for _ctypes types:
    - disallow instantiation
    - inheritance (MRO)
    - immutability
    - type name
    
    The following _ctypes types are tested:
    - Array
    - CField
    - COMError
    - PyCArrayType
    - PyCFuncPtrType
    - PyCPointerType
    - PyCSimpleType
    - PyCStructType
    - Structure
    - Union
    - UnionType
    - _CFuncPtr
    - _Pointer
    - _SimpleCData
    
    Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
    
    * gh-113650: Add workaround option for MSVC ARM64 bug affecting string encoding (GH-113836)
    
    * Fix opcode name printing in debug mode (#113870)
    
    Fix a few places where the lltrace debug output printed ``(null)`` instead of an opcode name, because it was calling ``_PyUOpName()`` on a Tier-1 opcode.
    
    * Simplify binomial approximation example with random.binomialvariate() (gh-113871)
    
    * GH-113528: Deoptimise `pathlib._abc.PathBase._make_child_relpath()` (#113532)
    
    Call straight through to `joinpath()` in `PathBase._make_child_relpath()`.
    Move optimised/caching code to `pathlib.Path._make_child_relpath()`
    
    * gh-113848: Use PyErr_GivenExceptionMatches() for check for CancelledError (GH-113849)
    
    * gh-113848: Handle CancelledError subclasses in asyncio TaskGroup() and timeout() (GH-113850)
    
    * gh-113781: Silence AttributeError in warning module during Python finalization (GH-113813)
    
    The tracemalloc module can already be cleared.
    
    * GH-113661: unittest runner: Don't exit 5 if tests were skipped (#113856)
    
    The intention of exiting 5 was to detect issues where the test suite
    wasn't discovered at all. If we skipped tests, it was correctly
    discovered.
    
    * GH-113528: Deoptimise `pathlib._abc.PathBase.resolve()` (#113782)
    
    Replace use of `_from_parsed_parts()` with `with_segments()` in
    `resolve()`.
    
    No effect on `Path.resolve()`, which uses `os.path.realpath()`.
    
    * gh-66060: Use actual class name in _io type's __repr__ (#30824)
    
    Use the object's actual class name in the following _io type's __repr__:
    - FileIO
    - TextIOWrapper
    - _WindowsConsoleIO
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase.parts` (#113883)
    
    Implement `parts` using `_stack`, which itself calls `pathmod.split()`
    repeatedly. This avoids use of `_tail`, which will be moved to `PurePath`
    shortly.
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (again) (#113882)
    
    Restore full battle-tested implementations of `PurePath.[is_]relative_to()`. These were recently split up in 3375dfe and a15a773.
    
    In `PurePathBase`, add entirely new implementations based on `_stack`, which itself calls `pathmod.split()` repeatedly to disassemble a path. These new implementations preserve features like trailing slashes where possible, while still observing that a `..` segment cannot be added to traverse an empty or `.` segment in *walk_up* mode. They do not rely on `parents` nor `__eq__()`, nor do they spin up temporary path objects.
    
    Unfortunately calling `pathmod.relpath()` isn't an option, as it calls `abspath()` and in turn `os.getcwd()`, which is impure.
    
    * gh-111968: Introduce _PyFreeListState and _PyFreeListState_GET API (gh-113584)
    
    * GH-113528: Deoptimise `pathlib._abc.PurePathBase` (#113559)
    
    Apply pathlib's normalization and performance tuning in `pathlib.PurePath`, but not `pathlib._abc.PurePathBase`.
    
    With this change, the pathlib ABCs do not normalize away alternate path separators, empty segments, or dot segments. A single string given to the initialiser will round-trip by default, i.e. `str(PurePathBase(my_string)) == my_string`. Implementors can set their own path domain-specific normalization scheme by overriding `__str__()`
    
    Eliminating path normalization makes maintaining and caching the path's parts and string representation both optional and not very useful, so this commit moves the `_drv`, `_root`, `_tail_cached` and `_str` slots from `PurePathBase` to `PurePath`. Only `_raw_paths` and `_resolving` slots remain in `PurePathBase`. This frees the ABCs from the burden of some of pathlib's hardest-to-understand code.
    
    * pathlib ABCs: Require one or more initialiser arguments (#113885)
    
    Refuse to guess what a user means when they initialise a pathlib ABC
    without any positional arguments. In mainline pathlib it's normalised to
    `.`, but in the ABCs this guess isn't appropriate; for example, the path
    type may not represent the current directory as `.`, or may have no concept
    of a "current directory" at all.
    
    * gh-112182: Replace StopIteration with RuntimeError for future (#113220)
    
    When an `StopIteration` raises into `asyncio.Future`, this will cause
    a thread to hang. This commit address this by not raising an exception
    and silently transforming the `StopIteration` with a `RuntimeError`,
    which the caller can reconstruct from `fut.exception().__cause__`
    
    * GH-113858: GitHub Actions config: Only save ccache on pushes (GH-113859)
    
    * gh-113877: Fix Tkinter method winfo_pathname() on 64-bit Windows (GH-113900)
    
    winfo_id() converts the result of "winfo id" command to integer, but
    "winfo pathname" command requires an argument to be a hexadecimal number
    on Win64.
    
    * gh-113879: Fix ResourceWarning in test_asyncio.test_server (GH-113881)
    
    * gh-96037: Always insert TimeoutError when exit an expired asyncio.timeout() block (GH-113819)
    
    If other exception was raised during exiting an expired
    asyncio.timeout() block, insert TimeoutError in the exception context
    just above the CancelledError.
    
    * gh-70835: Clarify error message for CSV file opened with wrong newline (GH-113786)
    
    Based on patch by SilentGhost.
    
    * gh-113594: Fix UnicodeEncodeError in TokenList.fold() (GH-113730)
    
    It occurred when try to re-encode an unknown-8bit part combined with non-unknown-8bit part.
    
    * gh-113664: Improve style of Big O notation (GH-113695)
    
    Use cursive to make it looking like mathematic formulas.
    
    * gh-58032: Do not use argparse.FileType in module CLIs and scripts (GH-113649)
    
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    
    * gh-89850: Add default C implementations of persistent_id() and persistent_load() (GH-113579)
    
    Previously the C implementation of pickle.Pickler and pickle.Unpickler
    classes did not have such methods and they could only be used if
    they were overloaded in subclasses or set as instance attributes.
    
    Fixed calling super().persistent_id() and super().persistent_load() in
    subclasses of the C implementation of pickle.Pickler and pickle.Unpickler
    classes. It no longer causes an infinite recursion.
    
    * gh-66515: Fix locking of an MH mailbox without ".mh_sequences" file (GH-113482)
    
    Guarantee that it either open an existing ".mh_sequences" file or create
    a new ".mh_sequences" file, but do not replace existing ".mh_sequences"
    file.
    
    * gh-111789: Use PyDict_GetItemRef() in Modules/_zoneinfo.c (GH-112078)
    
    * gh-109858: Protect zipfile from "quoted-overlap" zipbomb (GH-110016)
    
    Raise BadZipFile when try to read an entry that overlaps with other entry or
    central directory.
    
    * gh-111139: Optimize math.gcd(int, int) (#113887)
    
    Add a fast-path for the common case.
    
    Benchmark:
    
        python -m pyperf timeit \
            -s 'import math; gcd=math.gcd; x=2*3; y=3*5' \
            'gcd(x,y)'
    
    Result: 1.07x faster (-3.4 ns)
    
        Mean +- std dev: 52.6 ns +- 4.0 ns -> 49.2 ns +- 0.4 ns: 1.07x faster
    
    * GH-113860: All executors are now defined in terms of micro ops. Convert counter executor to use uops. (GH-113864)
    
    * gh-111968: Use per-thread freelists for float in free-threading (gh-113886)
    
    * Add @requires_zlib() decorator for gh-109858 tests (GH-113918)
    
    * gh-113625: Align object addresses in the Descriptor HowTo Guide (#113894)
    
    * gh-113753: Clear finalized bit when putting PyAsyncGenASend back into free list (#113754)
    
    * gh-112302: Point core developers to SBOM devguide on errors (#113490)
    
    Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
    
    * gh-77046: os.pipe() sets _O_NOINHERIT flag on fds (#113817)
    
    On Windows, set _O_NOINHERIT flag on file descriptors
    created by os.pipe() and io.WindowsConsoleIO.
    
    Add test_pipe_spawnl() to test_os.
    
    Co-authored-by: Zackery Spytz <zspytz@gmail.com>
    
    * gh-87868: Skip `test_one_environment_variable` in `test_subprocess` when the platform or build cannot do that (#113867)
    
    * improve the assert for test_one_environment_variable
    * skip some test in test_subprocess when python is configured with shared
    * also skip the test if AddressSanitizer is enabled
    
    ---------
    
    Co-authored-by: Steve Dower <steve.dower@microsoft.com>
    
    * gh-113896: Fix test_builtin.BuiltinTest.test___ne__() (#113897)
    
    Fix DeprecationWarning in test___ne__().
    
    Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
    
    * gh-111968: Unify naming scheme for freelist (gh-113919)
    
    * gh-89811: Check for valid tp_version_tag in specializer (GH-113558)
    
    * gh-112640: Add `kwdefaults` parameter to `types.FunctionType.__new__` (#112641)
    
    * gh-112419: Document removal of sys.meta_path's 'find_module' fallback (#112421)
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    
    * gh-113932: assert ``SyntaxWarning`` in test_compile.TestSpecifics.test_… (#113933)
    
    * gh-91960: Remove Cirrus CI configuration (#113938)
    
    Remove .cirrus.yml which was already disabled by being renamed to
    .cirrus-DISABLED.yml. In total, Cirrus CI only run for less than one
    month.
    
    * gh-107901: jump leaving an exception handler doesn't need an eval break check (#113943)
    
    * GH-113853: Guarantee forward progress in executors (GH-113854)
    
    * gh-113845: Fix a compiler warning in Python/suggestions.c (GH-113949)
    
    * gh-111968: Use per-thread freelists for tuple in free-threading (gh-113921)
    
    * Update KDE recipe to match the standard use of the h parameter (gh-#113958)
    
    * gh-81489: Use Unicode APIs for mmap tagname on Windows (GH-14133)
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    
    * GH-107678: Improve Unicode handling clarity in ``library/re.rst`` (#107679)
    
    * Improve kde graph with better caption and number formatting (gh-113967)
    
    * gh-111968: Explicit handling for finalized freelist (gh-113929)
    
    * gh-113903: Fix an IDLE configdialog test (#113973)
    
    test_configdialog.HighPageTest.test_highlight_target_text_mouse fails
    if a line of the Highlight tab text sample is not visible. If so, bbox()
    in click_char() returns None and the unpacking iteration fails.
    
    This occurred on a Devuan Linux system. Fix by moving the
    'see character' call inside click_char, just before the bbox call.
    
    Also, reduce the click_char calls to just one per tag name and
    replace the other nested function with a dict comprehension.
    
    * gh-113937 Fix failures in type cache tests due to re-running (GH-113953)
    
    * gh-113858: Cut down ccache size (GH-113945)
    
    Cut down ccache size
    
    - Only save the ccache in the main reusable builds, not on builds that
      don't use special build options:
      - Generated files check
      - OpenSSL tests
      - Hypothesis tests
    - Halve the max cache size, to 200M
    
    * gh-108364: In sqlite3, disable foreign keys before dumping SQL schema (#113957)
    
    sqlite3.Connection.iterdump now ensures that foreign key support is
    disabled before dumping the database schema, if there is any foreign key
    violation.
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    
    * gh-113027: Fix timezone check in test_variable_tzname in test_email (GH-113835)
    
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * GH-113860: Get rid of `_PyUOpExecutorObject` (GH-113954)
    
    * Docs: Amend codeobject.co_lines docs; end number is exclusive (#113970)
    
    The end number should be exclusive, not inclusive.
    
    * gh-111877: Fixes stat() handling for inaccessible files on Windows (GH-113716)
    
    * gh-113980: Fix resource warnings in test_asyncgen (GH-113984)
    
    * gh-107901: duplicate blocks with no lineno that have an eval break and multiple predecessors (#113950)
    
    * gh-113868: Add a number of MAP_* flags from macOS to module mmap (#113869)
    
    The new flags were extracted from the macOS 14.2 SDK.
    
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * gh-113710: Add types to the interpreter DSL (#113711)
    
    Co-authored-by: Jules <57632293+JuliaPoo@users.noreply.github.com>
    Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
    
    * gh-113971: Make `zipfile.ZipInfo._compresslevel` public as `.compress_level` (#113969)
    
    Make zipfile.ZipInfo.compress_level public.
    
    A property is used to retain the behavior of the ._compresslevel.
    
    People constructing zipfile.ZipInfo instances to pass into existing APIs to control per-file compression levels already treat this as public, there was never a reason for it not to be.
    
    I used the more modern name compress_level instead of compresslevel as the keyword argument on other ZipFile APIs is called to be consistent with compress_type and a general long term preference of not runningwordstogether without a separator in names.
    
    * GH-111802: set a low recursion limit for `test_bad_getattr()` in `test.pickletester` (GH-113996)
    
    * gh-95649: Document that asyncio contains uvloop code (#107536)
    
    Some of the asyncio SSL changes in GH-31275 [1] were taken from
    v0.16.0 of the uvloop project [2]. In order to comply with the MIT
    license, we need to just need to document the copyright information.
    
    [1]: https://github.com/python/cpython/pull/31275
    [2]: https://github.com/MagicStack/uvloop/tree/v0.16.0
    
    * gh-101100: Fix Sphinx Lint warnings in `Misc/` (#113946)
    
    Fix Sphinx Lint warnings in Misc/
    
    * Fix a grammatical error in `pycore_pymem.h` (#112993)
    
    * Tutorial: Clarify 'nonzero exit status' in the appendix (#112039)
    
    * Link to the glossary for "magic methods" in ``MagicMock`` (#111292)
    
    The MagicMock documentation mentions magic methods several times without
    actually pointing to the term in the glossary. This can be helpful for
    people to fully understand what those magic methods are.
    
    * datamodel: Fix a typo in ``object.__init_subclass__`` (#111599)
    
    * GH-111801: set a lower recursion limit for `test_infintely_many_bases()` in `test_isinstance` (#113997)
    
    * gh-89159: Document missing TarInfo members (#91564)
    
    * GH-111798: skip `test_super_deep()` from `test_call` under pydebug builds on WASI (GH-114010)
    
    * GH-44626, GH-105476: Fix `ntpath.isabs()` handling of part-absolute paths (#113829)
    
    On Windows, `os.path.isabs()` now returns `False` when given a path that
    starts with exactly one (back)slash. This is more compatible with other
    functions in `os.path`, and with Microsoft's own documentation.
    
    Also adjust `pathlib.PureWindowsPath.is_absolute()` to call
    `ntpath.isabs()`, which corrects its handling of partial UNC/device paths
    like `//foo`.
    
    Co-authored-by: Jon Foster <jon@jon-foster.co.uk>
    
    * pathlib ABCs: add `_raw_path` property (#113976)
    
    It's wrong for the `PurePathBase` methods to rely so much on `__str__()`.
    Instead, they should treat the raw path(s) as opaque objects and leave the
    details to `pathmod`.
    
    This commit adds a `PurePathBase._raw_path` property and uses it through
    many of the other ABC methods. These methods are all redefined in
    `PurePath` and `Path`, so this has no effect on the public classes.
    
    * Add module docstring for `pathlib._abc`. (#113691)
    
    * gh-101225: Increase the socket backlog when creating a multiprocessing.connection.Listener (#113567)
    
    Increase the backlog for multiprocessing.connection.Listener` objects created
     by `multiprocessing.manager` and `multiprocessing.resource_sharer` to
     significantly reduce the risk of getting a connection refused error when creating
     a `multiprocessing.connection.Connection` to them.
    
    * gh-114014: Update `fractions.Fraction()`'s rational parsing regex (#114015)
    
    Fix a bug in the regex used for parsing a string input to the `fractions.Fraction` constructor. That bug led to an inconsistent exception message being given for some inputs.
    
    ---------
    
    Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
    Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
    
    * gh-111803: Support loading more deeply nested lists in binary plist format (GH-114024)
    
    It no longer uses the C stack. The depth of nesting is only limited by
    Python recursion limit setting.
    
    * gh-113317: Move global utility functions into libclinic (#113986)
    
    Establish Tools/clinic/libclinic/utils.py and move the following
    functions over there:
    
    - compute_checksum()
    - create_regex()
    - write_file()
    
    * gh-101100: Fix Sphinx warnings in `howto/urllib2.rst` and `library/http.client.rst` (#114060)
    
    * Add `pathlib._abc.PathModuleBase` (#113893)
    
    Path modules provide a subset of the `os.path` API, specifically those
    functions needed to provide `PurePathBase` functionality. Each
    `PurePathBase` subclass references its path module via a `pathmod` class
    attribute.
    
    This commit adds a new `PathModuleBase` class, which provides abstract
    methods that unconditionally raise `UnsupportedOperation`. An instance of
    this class is assigned to `PurePathBase.pathmod`, replacing `posixpath`.
    As a result, `PurePathBase` is no longer POSIX-y by default, and
    all its methods raise `UnsupportedOperation` courtesy of `pathmod`.
    
    Users who subclass `PurePathBase` or `PathBase` should choose the path
    syntax by setting `pathmod` to `posixpath`, `ntpath`, `os.path`, or their
    own subclass of `PathModuleBase`, as circumstances demand.
    
    * Replace `pathlib._abc.PathModuleBase.splitroot()` with `splitdrive()` (#114065)
    
    This allows users of the `pathlib-abc` PyPI package to use `posixpath` or
    `ntpath` as a path module in versions of Python lacking
    `os.path.splitroot()` (3.11 and before).
    
    * gh-113317: Move FormatCounterFormatter into libclinic (#114066)
    
    * gh-109862: Fix test_create_subprocess_with_pidfd when it was run separately (GH-113991)
    
    * gh-114075: Capture `test_compileall` stdout output  (#114076)
    
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    
    * gh-113666: Adding missing UF_ and SF_ flags to module 'stat' (#113667)
    
    Add some constants to module 'stat' that are used on macOS.
    
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * GH-112354: `_GUARD_IS_TRUE_POP` side-exits to target the next instruction, not themselves. (GH-114078)
    
    * gh-109598: make PyComplex_RealAsDouble/ImagAsDouble use __complex__ (GH-109647)
    
    `PyComplex_RealAsDouble()`/`PyComplex_ImagAsDouble` now try to convert
    an object to a `complex` instance using its `__complex__()` method
    before falling back to the ``__float__()`` method.
    
    PyComplex_ImagAsDouble() also will not silently return 0.0 for
    non-complex types anymore.  Instead we try to call PyFloat_AsDouble()
    and return 0.0 only if this call is successful.
    
    * gh-112532: Fix memory block count for free-threaded build (gh-113995)
    
    This fixes `_PyInterpreterState_GetAllocatedBlocks()` and
    `_Py_GetGlobalAllocatedBlocks()` in the free-threaded builds. The
    gh-113263 change that introduced multiple mimalloc heaps per-thread
    broke the logic for counting the number of allocated blocks. For subtle
    reasons, this led to reported reference count leaks in the refleaks
    buildbots.
    
    * gh-111968: Use per-thread slice_cache in free-threading (gh-113972)
    
    * gh-99437: runpy: decode path-like objects before setting globals
    
    * gh-114070: correct the specification of ``digit`` in the float() docs (#114080)
    
    * gh-91539: Small performance improvement of urrlib.request.getproxies_environment() (#108771)
    
     Small performance improvement of getproxies_environment() when there are many environment variables. In a benchmark with 5k environment variables not related to proxies, and 5 specifying proxies, we get a 10% walltime improvement.
    
    * gh-112087: Update list impl to be thread-safe with manual CS (gh-113863)
    
    * gh-78502: Add a trackfd parameter to mmap.mmap() (GH-25425)
    
    If *trackfd* is False, the file descriptor specified by *fileno*
    will not be duplicated.
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    Co-authored-by: Petr Viktorin <encukou@gmail.com>
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * gh-114101: Correct PyErr_Format arguments in _testcapi module (#114102)
    
    - use PyErr_SetString() iso. PyErr_Format() in parse_tuple_and_keywords()
    - fix misspelled format specifier in CHECK_SIGNNESS() macro
    
    * GH-113655: Lower the C recursion limit on various platforms (GH-113944)
    
    * gh-113358: Fix rendering tracebacks with exceptions with a broken __getattr__ (GH-113359)
    
    Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
    
    * gh-113238: add Anchor to importlib.resources (#113801)
    
    Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
    
    * gh-114077: Fix OverflowError in socket.sendfile() when pass count >2GiB (GH-114079)
    
    * Docs: Align multiprocessing.shared_memory docs with Sphinx recommendations (#114103)
    
    - add :class: and :mod: markups where needed
    - fix incorrect escaping of a star in ShareableList arg spec
    - mark up parameters with stars: *val*
    - mark up list of built-in types using list markup
    - remove unneeded parentheses from :meth: markups
    
    * gh-113858: GH Actions: Limit max ccache size for the asan build (GH-114113)
    
    * gh-114107: Fix importlib.resources symlink test if symlinks aren't supported (#114108)
    
    gh-114107: Fix symlink test if symlinks aren't supported
    
    * gh-102468: Document `PyCFunction_New*` and `PyCMethod_New` (GH-112557)
    
    Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
    
    * gh-113626: Add allow_code parameter in marshal functions (GH-113648)
    
    Passing allow_code=False prevents serialization and de-serialization of
    code objects which is incompatible between Python versions.
    
    * gh-111968: Use per-thread freelists for PyContext in free-threading (gh-114122)
    
    * gh-114107: test.pythoninfo logs Windows Developer Mode (#114121)
    
    Also, don't skip the whole collect_windows() if ctypes is missing.
    
    Log also ctypes.windll.shell32.IsUserAnAdmin().
    
    * Fix an incorrect comment in iobase_is_closed (GH-102952)
    
    This comment appears to have been mistakenly copied from what is now
    called iobase_check_closed() in commit 4d9aec022063.
    
    Also unite the iobase_check_closed() code with the relevant comment.
    
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    
    * gh-114069: Revise Tutorial Methods paragraph (#114127)
    
    Remove excess words in the first and third sentences.
    
    * gh-114096: Restore privileges in _winapi.CreateJunction after creating the junction (GH-114089)
    
    This avoids impact on later parts of the application which may be able to do things they otherwise shouldn't.
    
    * Docs: Improve multiprocessing.SharedMemory reference (#114093)
    
    Align the multiprocessing shared memory docs with Diatáxis's
    recommendations for references.
    
    - use a parameter list for the SharedMemory.__init__() argument spec
    - use the imperative mode
    - use versionadded, not versionchanged, for added parameters
    - reflow touched lines according to SemBr
    
    * Fix 'expresion' typo in IDLE doc (#114130)
    
    The substantive change is on line 577/593. Rest is header/footer stuff ignored when displaying.
    
    * gh-113659: Skip hidden .pth files (GH-113660)
    
    Skip .pth files with names starting with a dot or hidden file attribute.
    
    * Clean up backslash avoiding code in ast, fix typo (#113605)
    
    As of #108553, the `_avoid_backslashes` code path is dead
    
    `scape_newlines` was introduced in #110271. Happy to drop the typo fix
    if we don't want it
    
    * GH-114013: fix setting `HOSTRUNNER` for `Tools/wasm/wasi.py` (GH-114097)
    
    Also fix tests found failing under a pydebug build of WASI thanks to `make test` working due to this change.
    
    * Update copyright years to 2024. (GH-113608)
    
    Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
    
    * gh-112529: Track if debug allocator is used as underlying allocator (#113747)
    
    * gh-112529: Track if debug allocator is used as underlying allocator
    
    The GC implementation for free-threaded builds will need to accurately
    detect if the debug allocator is used because it affects the offset of
    the Python object from the beginning of the memory allocation. The
    current implementation of `_PyMem_DebugEnabled` only considers if the
    debug allocator is the outer-most allocator; it doesn't handle the case
    of "hooks" like tracemalloc being used on top of the debug allocator.
    
    This change enables more accurate detection of the debug allocator by
    tracking when debug hooks are enabled.
    
    * Simplify _PyMem_DebugEnabled
    
    * gh-113655: Increase default stack size for PGO builds to avoid C stack exhaustion (GH-114148)
    
    * GH-78988: Document `pathlib.Path.glob()` exception propagation. (#114036)
    
    We propagate the `OSError` from the `is_dir()` call on the top-level
    directory, and suppress all others.
    
    * gh-94220: Align fnmatch docs with the implementation and amend markup (#114152)
    
    - Align the argument spec for fnmatch functions with the actual
      implementation.
    - Update Sphinx markup to recent recommandations.
    - Add link to 'iterable' glossary entry.
    
    Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
    
    * Fix typo in c_annotations.py comment (#108773)
    
    "compatability" => "compatibility"
    
    * GH-110109: pathlib docs: bring `from_uri()` and `as_uri()` together. (#110312)
    
    This is a very soft deprecation of `PurePath.as_uri()`. We instead document
    it as a `Path` method, and add a couple of sentences mentioning that it's
    also available in `PurePath`.
    
    Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
    
    * gh-106293: Fix typos in Objects/object_layout.md (#106294)
    
    Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
    
    * gh-88531 Fix dataclass __post_init__/__init__ interplay documentation (gh-107404)
    
    * Simplify __post_init__ example usage. It applies to all base classes, not just dataclasses.
    
    * gh-112043: Align concurrent.futures.Executor.map docs with implementation (#114153)
    
    The first parameter is named 'fn', not 'func'.
    
    * gh-81479: For Help => IDLE Doc, stop double-spacing some lists. (#114168)
    
    This matches Firefox format.  Edge double-spaces non-simple
    list but I think it looks worse.
    
    * gh-72284: Revise lists in IDLE doc  (#114174)
    
    Tkinter is a fact, not necessarily a feature.
    
    Reorganize editor key bindings in a logical order
    and remove those that do not work, at least on Windows.
    
    Improve shell bindings list.
    
    * gh-86179: Skip test case that fails on POSIX with unversioned binary (GH-114136)
    
    * Python 3.13.0a3
    
    * gh-104282: Fix null pointer dereference in `lzma._decode_filter_properties` (GH-104283)
    
    * gh-111301: Advertise importlib methods removal in What's new in Python 3.12 (GH-111630)
    
    * gh-112343: pdb: Use tokenize to replace convenience variables (#112380)
    
    * Post 3.13.0a3
    
    * gh-114178: Fix generate_sbom.py for out-of-tree builds (#114179)
    
    * gh-114070: fix token reference warnings in expressions.rst (#114169)
    
    * gh-114149: [Enum] fix tuple subclass handling when using custom __new__ (GH-114160)
    
    * gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106)
    
    * Fix typo in tkinter.ttk.rst (GH-106157)
    
    * gh-38807: Fix race condition in Lib/trace.py (GH-110143)
    
    Instead of checking if a directory does not exist and thereafter
    creating it, directly call os.makedirs() with the exist_ok=True.
    
    * gh-112984 Update Windows build and installer for free-threaded builds (GH-113129)
    
    * gh-112984: Fix test_ctypes.test_loading.test_load_dll_with_flags when directory name includes a dot (GH-114217)
    
    * gh-114149: [Enum] revert #114160 and add more tuple-subclass tests (GH-114215)
    
    This reverts commit 05e142b1543eb9662d6cc33722e7e16250c9219f.
    
    * gh-104522: Fix OSError raised when run a subprocess (#114195)
    
    Only set filename to cwd if it was caused by failed chdir(cwd).
    
    _fork_exec() now returns "noexec:chdir" for failed chdir(cwd).
    
    Co-authored-by: Robert O'Shea <PurityLake@users.noreply.github.com>
    
    * gh-113205: test_multiprocessing.test_terminate: Test the API on threadpools (#114186)
    
    gh-113205: test_multiprocessing.test_terminate: Test the API works on threadpools
    
    Threads can't be forced to terminate (without potentially corrupting too much
    state), so the  expected behaviour of `ThreadPool.terminate` is to wait for
    the currently executing tasks to finish.
    
    The entire test was skipped in GH-110848 (0e9c364f4ac18a2237bdbac702b96bcf8ef9cb09).
    Instead of skipping it entirely, we should ensure the API eventually succeeds:
    use a shorter timeout.
    
    For the record: on my machine, when the test is un-skipped, the task manages to
    start in about 1.5% cases.
    
    * gh-114211: Update EmailMessage doc about ordered keys (#114224)
    
    Ordered keys are no longer unlike 'real dict's.
    
    * gh-96905: In IDLE code, stop redefining built-ins 'dict' and 'object' (#114227)
    
    Prefix 'dict' with 'o', 'g', or 'l' for 'object', 'global', or 'local'.
    Suffix 'object' with '_'.
    
    * gh-114231: Fix indentation in enum.rst (#114232)
    
    * gh-104522: Fix test_subprocess failure when build Python in the root home directory (GH-114236)
    
    * gh-104522: Fix test_subprocess failure when build Python in the root home directory
    
    EPERM is raised when setreuid() fails.
    EACCES is set in execve() when the test user has not access to sys.executable.
    
    * gh-114050: Fix crash when more than two arguments are passed to int() (GH-114067)
    
    Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
    
    * gh-103092: Convert some `_ctypes` metatypes to heap types (GH-113620)
    
    
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    
    * gh-110345: show Tcl/Tk patchlevel in `tkinter._test()` (GH-110350)
    
    * Delete unused macro (GH-114238)
    
    * gh-108303: Move all doctest related files and tests to `Lib/test/test_doctest/` (#112109)
    
    Co-authored-by: Brett Cannon <brett@python.org>
    
    * gh-114198: Rename dataclass __replace__ argument to 'self' (gh-114251)
    
    This change renames the dataclass __replace__ method's first argument
    name from 'obj' to 'self'.
    
    * gh-114087: Speed up dataclasses._asdict_inner (#114088)
    
    * gh-111968: Use per-thread freelists for generator in free-threading (gh-114189)
    
    * gh-112092: clarify unstable ABI recompilation requirements (#112093)
    
    Use different versions in the examples for when extensions do and do not need to be recompiled to make the examples easier to understand.
    
    * gh-114123: Migrate docstring from _csv to csv (#114124)
    
    Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
    Co-authored-by: Éric <merwok@netwok.org>
    
    * gh-112087: Remove duplicated critical_section (gh-114268)
    
    * gh-111968: Fix --without-freelists build (gh-114270)
    
    * gh-114286: Fix `maybe-uninitialized` warning in `Modules/_io/fileio.c` (GH-114287)
    
    * gh-113884: Refactor `queue.SimpleQueue` to use a ring buffer to store items (#114259)
    
    Use a ring buffer instead of a Python list in order to simplify the
    process of making queue.SimpleQueue thread-safe in free-threaded
    builds. The ring buffer implementation has no places where critical
    sections may be released.
    
    * gh-114275: Skip doctests that use `asyncio` in `test_pdb` for WASI builds (#114309)
    
    * gh-114265: move line number propagation before cfg optimization, remove guarantee_lineno_for_exits (#114267)
    
    * Retain shorter tables of contents for Sphinx 5.2.3+ (#114318)
    
    Disable toc_object_entries, new in Sphinx 5.2.3
    
    * Add a `clean` subcommand to `Tools/wasm/wasi.py` (GH-114274)
    
    * GH-79634: Accept path-like objects as pathlib glob patterns. (#114017)
    
    Allow `os.PathLike` objects to be passed as patterns to `pathlib.Path.glob()` and `rglob()`. (It's already possible to use them in `PurePath.match()`)
    
    While we're in the area:
    
    - Allow empty glob patterns in `PathBase` (but not `Path`)
    - Speed up globbing in `PathBase` by generating paths with trailing slashes only as a final step, rather than for every intermediate directory.
    - Simplify and speed up handling of rare patterns involving both `**` and `..` segments.
    
    * GH-113225: Speed up `pathlib.Path.walk(top_down=False)` (#113693)
    
    Use `_make_child_entry()` rather than `_make_child_relpath()` to retrieve
    path objects for directories to visit. This saves the allocation of one
    path object per directory in user subclasses of `PathBase`, and avoids a
    second loop.
    
    This trick does not apply when walking top-down, because users can affect
    the walk by modifying *dirnames* in-place.
    
    A side effect of this change is that, in bottom-up mode, subdirectories of
    each directory are visited in reverse order, and that this order doesn't
    match that of the names in *dirnames*. I suspect this is fine as the
    order is arbitrary anyway.
    
    * gh-114332: Fix the flags reference for ``re.compile()`` (#114334)
    
    The GH-93000 change set inadvertently caused a sentence in re.compile()
    documentation to refer to details that no longer followed. Correct this
    with a link to the Flags sub-subsection.
    
    Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
    
    * GH-99380: Update to Sphinx 7 (#99381)
    
    * Docs: structure the ftplib reference (#114317)
    
    Introduce the following headings and subheadings:
    
    - Reference
      * FTP objects
      * FTP_TLS objects
      * Module variables
    
    * gh-112529: Use GC heaps for GC allocations in free-threaded builds (gh-114157)
    
    * gh-112529: Use GC heaps for GC allocations in free-threaded builds
    
    The free-threaded build's garbage collector implementation will need to
    find GC objects by traversing mimalloc heaps. This hooks up the
    allocation calls with the correct heaps by using a thread-local
    "current_obj_heap" variable.
    
    * Refactor out setting heap based on type
    
    * gh-114281: Remove incorrect type hints from `asyncio.staggered` (#114282)
    
    Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
    
    * Docs: Add missing line continuation to FTP_TLS class docs (#114352)
    
    Regression introduced by b1ad5a5d4.
    
    * Remove the non-test Lib/test/time_hashlib.py. (#114354)
    
    I believe I added this while chasing some performance of hash functions
    when I first created hashlib.  It hasn't been used since, is frankly
    trivial, and not a test.
    
    * Remove deleted `time_hashlib.py` from `Lib/test/.ruff.toml` (#114355)
    
    * Fix the confusing "User-defined methods" reference in the datamodel (#114276)
    
    Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
    Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
    
    * Docs: mark up the FTP debug levels as a list (#114360)
    
    Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
    
    * gh-101100: Fix sphinx warnings in `Doc/c-api/memory.rst` (#114373)
    
    * gh-80931: Skip some socket tests while hunting for refleaks on macOS (#114057)
    
    Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.
    
    This PR skips those tests when doing a refleak test run to avoid hiding other problems.
    
    * Docs: mark up FTP() constructor with param list (#114359)
    
    Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
    
    * gh-114384: Align sys.set_asyncgen_hooks signature in docs to reflect implementation (#114385)
    
    * Docs: link to sys.stdout in ftplib docs (#114396)
    
    ---------
    
    Co-authored-by: Donghee Na <donghee.na@python.org>
    Co-authored-by: Sam Gross <colesbury@gmail.com>
    Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
    Co-authored-by: Itamar Oren <itamarost@gmail.com>
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
    Co-authored-by: Filip Łapkiewicz <80906036+fipachu@users.noreply.github.com>
    Co-authored-by: Brandt Bucher <brandtbucher@microsoft.com>
    Co-authored-by: Jamie Phan <jamie@ordinarylab.dev>
    Co-authored-by: wookie184 <wookie1840@gmail.com>
    Co-authored-by: Guido van Rossum <guido@python.org>
    Co-authored-by: Barney Gale <barney.gale@gmail.com>
    Co-authored-by: Mark Shannon <mark@hotpy.org>
    Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
    Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
    Co-authored-by: Zackery Spytz <zspytz@gmail.com>
    Co-authored-by: Xavier de Gaye <xdegaye@gmail.com>
    Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
    Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
    Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
    Co-authored-by: AN Long <aisk@users.noreply.github.com>
    Co-authored-by: Grigoriev Semyon <33061489+grigoriev-semyon@users.noreply.github.com>
    Co-authored-by: Rami <72725910+ramikg@users.noreply.github.com>
    Co-authored-by: Christian Heimes <christian@python.org>
    Co-authored-by: Gregory P. Smith <greg@krypto.org>
    Co-authored-by: Erlend E. Aasland <erlend@python.org>
    Co-authored-by: Levi Sabah <0xl3vi@gmail.com>
    Co-authored-by: Lee Cannon <leecannon@leecannon.xyz>
    Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
    Co-authored-by: neonene <53406459+neonene@users.noreply.github.com>
    Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
    Co-authored-by: Jakub Kulík <Kulikjak@gmail.com>
    Co-authored-by: Kristján Valur Jónsson <sweskman@gmail.com>
    Co-authored-by: Steve Dower <steve.dower@python.org>
    Co-authored-by: mara004 <geisserml@gmail.com>
    Co-authored-by: William Andrea <william.j.andrea@gmail.com>
    Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
    Co-authored-by: Vinay Sajip <vinay_sajip@yahoo.co.uk>
    Co-authored-by: Yan Yanchii <yyanchiy@gmail.com>
    Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
    Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
    Co-authored-by: Stefano Rivera <stefano@rivera.za.net>
    Co-authored-by: Petr Viktorin <encukou@gmail.com>
    Co-authored-by: Victor Stinner <vstinner@python.org>
    Co-authored-by: Seth Michael Larson <sethmichaellarson@gmail.com>
    Co-authored-by: Steve Dower <steve.dower@microsoft.com>
    Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
    Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
    Co-authored-by: Peter Lazorchak <lazorchakp@gmail.com>
    Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
    Co-authored-by: Ned Batchelder <ned@nedbatchelder.com>
    Co-authored-by: Ken Jin <kenjin@python.org>
    Co-authored-by: Jules <57632293+JuliaPoo@users.noreply.github.com>
    Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
    Co-authored-by: Brett Cannon <brett@python.org>
    Co-authored-by: Alois Klink <alois@aloisklink.com>
    Co-authored-by: Joseph Pearson <74079531+JoeyPearson822@users.noreply.github.com>
    Co-authored-by: Andrew Zipperer <47086307+zipperer@users.noreply.github.com>
    Co-authored-by: Pierre Equoy <pierre.equoy@canonical.com>
    Co-authored-by: InSync <122007197+InSyncWithFoo@users.noreply.github.com>
    Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com>
    Co-authored-by: Jon Foster <jon@jon-foster.co.uk>
    Co-authored-by: Crowthebird <78076854+thatbirdguythatuknownot@users.noreply.github.com>
    Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
    Co-authored-by: Kamil Turek <kamil.turek@hotmail.com>
    Co-authored-by: Raphaël Marinier <raphael.marinier@gmail.com>
    Co-authored-by: Jérome Perrin <perrinjerome@gmail.com>
    Co-authored-by: Mike Zimin <122507876+mikeziminio@users.noreply.github.com>
    Co-authored-by: Jonathon Reinhart <JonathonReinhart@users.noreply.github.com>
    Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
    Co-authored-by: solya0x <41440448+0xSalikh@users.noreply.github.com>
    Co-authored-by: Kuan-Wei Chiu <visitorckw@gmail.com>
    Co-authored-by: Mano Sriram <mano.sriram0@gmail.com>
    Co-authored-by: Steffen Zeile <48187781+Kaniee@users.noreply.github.com>
    Co-authored-by: Thomas Wouters <thomas@python.org>
    Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
    Co-authored-by: Karolina Surma <33810531+befeleme@users.noreply.github.com>
    Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
    Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
    Co-authored-by: Sheidan <37596668+Sh3idan@users.noreply.github.com>
    Co-authored-by: Christophe Nanteuil <35002064+christopheNan@users.noreply.github.com>
    Co-authored-by: buermarc <44375277+buermarc@users.noreply.github.com>
    Co-authored-by: Robert O'Shea <PurityLake@users.noreply.github.com>
    Co-authored-by: Miyashita Yosuke <44266492+miyashiiii@users.noreply.github.com>
    Co-authored-by: kcatss <kcats9731@gmail.com>
    Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
    Co-authored-by: Phillip Schanely <pschanely@gmail.com>
    Co-authored-by: keithasaurus <592217+keithasaurus@users.noreply.github.com>
    Co-authored-by: DerSchinken <53398996+DerSchinken@users.noreply.github.com>
    Co-authored-by: Skip Montanaro <skip.montanaro@gmail.com>
    Co-authored-by: Éric <merwok@netwok.org>
    Co-authored-by: mpage <mpage@meta.com>
    Co-authored-by: David H. Gutteridge <dhgutteridge@users.noreply.github.com>
    Co-authored-by: cdzhan <zhancdi@163.com>
    kulikjak pushed a commit to kulikjak/cpython that referenced this issue Jan 22, 2024
    …ts (pythonGH-113649)
    
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    aisk pushed a commit to aisk/cpython that referenced this issue Feb 11, 2024
    …ts (pythonGH-113649)
    
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    Glyphack pushed a commit to Glyphack/cpython that referenced this issue Sep 2, 2024
    …ts (pythonGH-113649)
    
    Open and close files manually. It prevents from leaking files,
    preliminary creation of output files, and accidental closing of stdin
    and stdout.
    @picnixz
    Copy link
    Contributor

    picnixz commented Sep 7, 2024

    @serhiy-storchaka Should we keep this one opened to deprecate FileType or do you want to close it (and not deprecate FileType for now)?

    @serhiy-storchaka
    Copy link
    Member

    #124664 deprecates argparse.FileType. Since it is widely used, no warning is emitted at runtime. A runtime warning will be added later, perhaps in 3.16, and finally it will be removed.

    @Mariatta
    Copy link
    Member

    A runtime warning will be added later, perhaps in 3.16, and finally it will be removed.

    Sorry, the sentence is a bit ambiguous.
    Do you mean to add the warning in 3.16 (so that the earliest removal is at least 3.18), or to have it finally removed in 3.16?

    @Mariatta
    Copy link
    Member

    If say, we have it removed in 3.18, does it mean we will keep this ticket open for 4 years more from now?

    @Mariatta
    Copy link
    Member

    I gathered that we just need to add this to pending-removal-in-future.rst and then we can close this ticket (after the PR is merged).

    @serhiy-storchaka
    Copy link
    Member

    Sorry for ambiguous wording. I meant that in future (perhaps in 3.16) we will add a runtime warning and start normal deprecation period, so the feature could be removed two years later, in 3.18. This way authors will have more time to remove the usage of FileType and do not annoy users with deprecation warnings.

    @Mariatta
    Copy link
    Member

    Thank you, the timeline is clearer to me now.

    I'm wondering two things:

    • Should we then raise PendingDeprecationWarning instead?
    • We know users shouldn't use this anymore. Why wait for 2 more releases? If we don't raise the warning, people won't be aware of the future deprecation until 2 releases later. If users have been using this functionality, they probably don't actively keep reading if the docs got updated with the note about "deprecated since 3.14". So I don't think delaying the deprecation warning will give people time to change. If this is broken and we don't want people to start using it's I suggest raising deprecation now and state that it will removed in 4 releases later (instead of 2).

    @serhiy-storchaka serhiy-storchaka self-assigned this Oct 10, 2024
    @serhiy-storchaka
    Copy link
    Member

    These are very good questions.

    I am afraid of the amount of user code this may affect. FileType is no longer directly used in the Python stdlib or scripts, but it is used in the CLI of some vendor packages (charset, charset_normalizer, distlib) used to build the documentation. It may add some noise in the build output if they are used via a CLI. I am sure that FileType is used in many user scripts despite its flaws. For simple script it may be not critical that it leaks or clamps files on errors or closes stdin or stdout just before quitting. Deprecation warning will add a noise in normal cases, when all works.

    This is why I wanted to first make the deprecation silent, documentation-only. To give more time to authors without annoying users. This would also send signal to linters. I forgot about PendingDeprecationWarning, it mitigates the issue with annoying warnings.

    I will add PendingDeprecationWarning. But now I need to modify a number of tests in test_argparse to silence the warning or check for it. My laziness was the other reason.

    @hugovk
    Copy link
    Member

    hugovk commented Oct 10, 2024

    I am afraid of the amount of user code this may affect.

    Searching the top 8k PyPI projects finds 384 matching lines in 138 projects for argparse.*FileType, which is ~1.7%.

    Details
    python3 ~/github/misc/cpython/search_pypi_top.py -q . "argparse.*FileType"
    ./dill-0.3.8.tar.gz: dill-0.3.8/dill/_objects.py: a['ArgParseFileType'] = argparse.FileType() # pickle ok
    ./commonmark-0.9.1.tar.gz: commonmark-0.9.1/commonmark/cmark.py: type=argparse.FileType('r'),
    ./commonmark-0.9.1.tar.gz: commonmark-0.9.1/commonmark/cmark.py: type=argparse.FileType('w'),
    ./conda-4.3.16.tar.gz: conda-4.3.16/conda/cli/main_config.py: # TODO: use argparse.FileType
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/__main__.py: subparser_cat.add_argument("files", nargs="*", type=argparse.FileType("rb"), help="Files to read", default=(sys.stdin,))
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/__main__.py: subparser_write.add_argument("--output", "-o", help="output file", type=argparse.FileType("wb"), default=sys.stdout)
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/__main__.py: subparser_write.add_argument("input_files", nargs="*", type=argparse.FileType("r"), help="Files to read", default=(sys.stdin,))
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/test/gen_interop_data.py: parser.add_argument("schema_path", type=argparse.FileType("r"))
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/test/gen_interop_data.py: type=argparse.FileType("wb"),
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/tool.py: subparser_dump.add_argument("input_file", type=argparse.FileType("rb"))
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/tool.py: subparser_rpcreceive.add_argument("-file", type=argparse.FileType("rb"), required=False)
    ./avro-1.11.3.tar.gz: avro-1.11.3/avro/tool.py: subparser_rpcsend.add_argument("-file", type=argparse.FileType("rb"))
    ./ConfigArgParse-1.7.tar.gz: ConfigArgParse-1.7/configargparse.py: FileType = argparse.FileType
    ./ConfigUpdater-3.2.tar.gz: ConfigUpdater-3.2/tools/stdlib_diff.py: cli.add_argument("-o", "--output", type=argparse.FileType("w"), default=sys.stdout)
    ./chardet-5.2.0.tar.gz: chardet-5.2.0/chardet/cli/chardetect.py: type=argparse.FileType("rb"),
    ./charset-normalizer-3.3.2.tar.gz: charset-normalizer-3.3.2/charset_normalizer/cli/__main__.py: "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed"
    ./dataclass-wizard-0.22.3.tar.gz: dataclass-wizard-0.22.3/dataclass_wizard/wizard_cli/cli.py: class FileTypeWithExt(argparse.FileType):
    ./dataclass-wizard-0.22.3.tar.gz: dataclass-wizard-0.22.3/dataclass_wizard/wizard_cli/cli.py: Extends :class:`argparse.FileType` to add a default file extension if the
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/monitor.py: file_post_parser.add_argument("file", help="json file holding all details", type=argparse.FileType("r"))
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/monitor.py: file_update_parser.add_argument("file", help="json file holding all details", type=argparse.FileType("r"))
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/screenboard.py: "file", help="screenboard files to push to the server", nargs="+", type=argparse.FileType("r")
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/service_level_objective.py: file_create_parser.add_argument("file", help="json file holding all details", type=argparse.FileType("r"))
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/service_level_objective.py: file_update_parser.add_argument("file", help="json file holding all details", type=argparse.FileType("r"))
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/timeboard.py: "file", help="timeboard files to push to the server", nargs="+", type=argparse.FileType("r")
    ./datadog-0.49.1.tar.gz: datadog-0.49.1/datadog/dogshell/timeboard.py: web_view_parser.add_argument("file", help="timeboard file", type=argparse.FileType("r"))
    ./apache_airflow-2.9.2.tar.gz: apache_airflow-2.9.2/airflow/cli/cli_config.py: type=argparse.FileType("w", encoding="UTF-8"),
    ./apache_airflow-2.9.2.tar.gz: apache_airflow-2.9.2/airflow/cli/cli_config.py: type=argparse.FileType("w", encoding="UTF-8"),
    ./apache_airflow-2.9.2.tar.gz: apache_airflow-2.9.2/airflow/cli/utils.py: with argparse.FileType points to stdout (by setting the path to ``-``). This
    ./datamodel_code_generator-0.25.7.tar.gz: datamodel_code_generator-0.25.7/datamodel_code_generator/arguments.py: from argparse import ArgumentParser, FileType, HelpFormatter, Namespace
    ./black-24.4.2.tar.gz: black-24.4.2/scripts/migrate-black.py: parser.add_argument("--logfile", type=argparse.FileType("w"), default=sys.stdout)
    ./clldutils-3.22.2.tar.gz: clldutils-3.22.2/src/clldutils/clilib.py: Similar to `argparse.FileType`.
    ./aqtinstall-3.1.16.tar.gz: aqtinstall-3.1.16/aqt/helper.py: # passed through command line argparse.FileType("r")
    ./aqtinstall-3.1.16.tar.gz: aqtinstall-3.1.16/aqt/installer.py: type=argparse.FileType("r"),
    ./aliyun-python-sdk-core-2.15.1.tar.gz: aliyun-python-sdk-core-2.15.1/aliyunsdkcore/vendored/requests/packages/chardet/cli/chardetect.py: type=argparse.FileType('rb'), nargs='*',
    ./aliyun-python-sdk-core-v3-2.13.33.tar.gz: aliyun-python-sdk-core-v3-2.13.33/aliyunsdkcore/vendored/requests/packages/chardet/cli/chardetect.py: type=argparse.FileType('rb'), nargs='*',
    ./cloudformation-cli-0.2.37.tar.gz: cloudformation-cli-0.2.37/src/rpdk/core/invoke.py: from argparse import FileType
    ./clvm_rs-0.7.0.tar.gz: clvm_rs-0.7.0/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/chardetect.py: type=argparse.FileType("rb"),
    ./arcgis2geojson-3.0.2.tar.gz: arcgis2geojson-3.0.2/arcgis2geojson/__init__.py: type=argparse.FileType("r"),
    ./argcomplete-3.4.0.tar.gz: argcomplete-3.4.0/test/test.py: parser.add_argument("--r", type=argparse.FileType("r"))
    ./argcomplete-3.4.0.tar.gz: argcomplete-3.4.0/test/test.py: parser.add_argument("--w", type=argparse.FileType("w"))
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: type = argparse.FileType('r')
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: type = argparse.FileType('wb', 1)
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('-x', type=argparse.FileType()),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('spam', type=argparse.FileType('r')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('-x', type=argparse.FileType('rb')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('spam', type=argparse.FileType('rb')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('-x', type=argparse.FileType('w')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('spam', type=argparse.FileType('w')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('-x', type=argparse.FileType('wb')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/test/test_argparse.py: Sig('spam', type=argparse.FileType('wb')),
    ./argparse-1.4.0.tar.gz: argparse-1.4.0/argparse.py: '--log', default=sys.stdout, type=argparse.FileType('w'),
    ./csvkit-2.0.0.tar.gz: csvkit-2.0.0/csvkit/utilities/csvgrep.py: from argparse import FileType
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument("InputFile",  type = argparse.FileType('rb'), nargs='?',
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument("-o", "--output", dest = 'OutputFile', type = argparse.FileType('wb'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("-j", "--json-file", dest = 'JsonFile', type=argparse.FileType('r'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("--pfx-file", dest='SignToolPfxFile', type=argparse.FileType('rb'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("--signer-private-cert", dest='OpenSslSignerPrivateCertFile', type=argparse.FileType('rb'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("--other-public-cert", dest='OpenSslOtherPublicCertFile', type=argparse.FileType('rb'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("--trusted-public-cert", dest='OpenSslTrustedPublicCertFile', type=argparse.FileType('rb'),
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Capsule/GenerateCapsule.py: parser.add_argument ("--embedded-driver", dest = 'EmbeddedDriver', type = argparse.FileType('rb'), action='append', default = [],
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Pkcs7Sign/Pkcs7Sign.py: parser.add_argument("--signer-private-cert", dest='SignerPrivateCertFile', type=argparse.FileType('rb'), help="specify the signer private cert filename.  If not specified, a test signer private cert is used.")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Pkcs7Sign/Pkcs7Sign.py: parser.add_argument("--other-public-cert", dest='OtherPublicCertFile', type=argparse.FileType('rb'), help="specify the other public cert filename.  If not specified, a test other public cert is used.")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Pkcs7Sign/Pkcs7Sign.py: parser.add_argument("--trusted-public-cert", dest='TrustedPublicCertFile', type=argparse.FileType('rb'), help="specify the trusted public cert filename.  If not specified, a test trusted public cert is used.")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Pkcs7Sign/Pkcs7Sign.py: parser.add_argument(metavar="input_file", dest='InputFile', type=argparse.FileType('rb'), help="specify the input filename")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256GenerateKeys.py: group.add_argument("-o", "--output", dest='OutputFile', type=argparse.FileType('wb'), metavar='filename', nargs='*', help="specify the output private key filename in PEM format")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256GenerateKeys.py: group.add_argument("-i", "--input", dest='InputFile', type=argparse.FileType('rb'), metavar='filename', nargs='*', help="specify the input private key filename in PEM format")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256GenerateKeys.py: parser.add_argument("--public-key-hash", dest='PublicKeyHashFile', type=argparse.FileType('wb'), help="specify the public key hash filename that is SHA 256 hash of 2048 bit RSA public key in binary format")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256GenerateKeys.py: parser.add_argument("--public-key-hash-c", dest='PublicKeyHashCFile', type=argparse.FileType('wb'), help="specify the public key hash filename that is SHA 256 hash of 2048 bit RSA public key in C structure format")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256Sign.py: parser.add_argument("--private-key", dest='PrivateKeyFile', type=argparse.FileType('rb'), help="specify the private key filename.  If not specified, a test signing key is used.")
    ./edk2-basetools-0.1.51.tar.gz: edk2-basetools-0.1.51/edk2basetools/Rsa2048Sha256Sign/Rsa2048Sha256Sign.py: parser.add_argument(metavar="input_file", dest='InputFile', type=argparse.FileType('rb'), help="specify the input filename")
    ./edk2_pytool_extensions-0.27.8.tar.gz: edk2_pytool_extensions-0.27.8/edk2toolext/capsule/capsule_tool.py: parser.add_argument('-o', dest='options_file', type=argparse.FileType('r'),
    ./edk2_pytool_extensions-0.27.8.tar.gz: edk2_pytool_extensions-0.27.8/edk2toolext/capsule/capsule_tool.py: parser.add_argument('capsule_payload', type=argparse.FileType('rb'),
    ./edx-django-release-util-1.4.0.tar.gz: edx-django-release-util-1.4.0/release_util/management/commands/check_reserved_keywords.py: type=argparse.FileType('r', encoding='UTF-8'),
    ./edx-django-release-util-1.4.0.tar.gz: edx-django-release-util-1.4.0/release_util/management/commands/check_reserved_keywords.py: type=argparse.FileType('r', encoding='UTF-8'),
    ./Faker-26.0.0.tar.gz: Faker-26.0.0/faker/cli.py: type=argparse.FileType("w"),
    ./df2gspread-1.0.4.tar.gz: df2gspread-1.0.4/bin/csv2gspread: parser.add_argument('--csv', type = argparse.FileType('r'), default = '-')
    ./brother_ql_inventree-1.2.tar.gz: brother_ql_inventree-1.2/brother_ql/brother_ql_analyse.py: parser.add_argument('file', help='The file to analyze', type=argparse.FileType('rb'))
    ./brother_ql_inventree-1.2.tar.gz: brother_ql_inventree-1.2/brother_ql/brother_ql_create.py: parser.add_argument('outfile', nargs='?', type=argparse.FileType('wb'), default=stdout, help='The file to write the instructions to. Defaults to stdout.')
    ./esp-idf-kconfig-2.2.0.tar.gz: esp-idf-kconfig-2.2.0/kconfgen/core.py: type=argparse.FileType("r"),
    ./esp-idf-kconfig-2.2.0.tar.gz: esp-idf-kconfig-2.2.0/kconfserver/core.py: type=argparse.FileType("r"),
    ./esp-idf-kconfig-2.2.0.tar.gz: esp-idf-kconfig-2.2.0/test/kconfserver/test_kconfserver.py: type=argparse.FileType("w"),
    ./esp-idf-size-1.5.0.tar.gz: esp-idf-size-1.5.0/esp_idf_size/core.py: type=argparse.FileType('r'))
    ./esp-idf-size-1.5.0.tar.gz: esp-idf-size-1.5.0/esp_idf_size/core.py: type=argparse.FileType('w'),
    ./esp_idf_panic_decoder-1.1.0.tar.gz: esp_idf_panic_decoder-1.1.0/esp_idf_panic_decoder/gdb_panic_server.py: parser.add_argument('input_file', type=argparse.FileType('r'),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/base_operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/base_operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/base_operations.py: type=argparse.FileType("w"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/base_operations.py: type=argparse.FileType("r"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/base_operations.py: type=argparse.FileType("r"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32/operations.py: "keyfile", help="Key file to digest (PEM format)", type=argparse.FileType("rb")
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c2/operations.py: "keyfile", help="Key file to digest (PEM format)", type=argparse.FileType("rb")
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c6/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c6/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c6/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32c6/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2beta1/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2beta1/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2beta1/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32h2beta1/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32p4/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32p4/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32p4/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32p4/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3beta2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3beta2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3beta2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espefuse/efuse/esp32s3beta2/operations.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: This class is a replacement of argparse.FileType('wb').
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: argparse.FileType('w')('-') returns STDOUT but argparse.FileType('wb') is not.
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: just like in the case of argparse.FileType('w').
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./esptool-4.7.0.tar.gz: esptool-4.7.0/espsecure/__init__.py: type=argparse.FileType("rb"),
    ./faust-cchardet-2.1.19.tar.gz: faust-cchardet-2.1.19/bin/cchardetect: type=argparse.FileType('rb'),
    ./cyclonedx_bom-4.5.0.tar.gz: cyclonedx_bom-4.5.0/CHANGELOG.md: [`argparse.FileType`](https://docs.python.org/3/library/argparse.html?highlight=pseudo-argument#argparse.FileType).
    ./cyclonedx_bom-4.5.0.tar.gz: cyclonedx_bom-4.5.0/cyclonedx_py/_internal/cli.py: from argparse import ArgumentParser, FileType, RawDescriptionHelpFormatter
    ./exrex-0.11.0.tar.gz: exrex-0.11.0/exrex.py: type=argparse.FileType('w', encoding='utf-8')
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/export_script_gen.py: 'src', type=argparse.FileType('r', encoding='UTF-8'), help='platform independent export file path'
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/export_script_gen.py: 'dest', type=argparse.FileType('w', encoding='UTF-8'), help='destination export file for required linker'
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/link_sbom.py: parser.add_argument('-o', '--output', type=argparse.FileType('w', encoding='UTF-8'), help='resulting SBOM file', required=True)
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/link_sbom.py: parser.add_argument('--vcs-info', type=argparse.FileType('r', encoding='UTF-8'), help='VCS information file', required=True)
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/rodata2asm.py: parser.add_argument('asm', type=argparse.FileType('w', encoding='UTF-8'), help='destination .asm file path')
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/rodata2cpp.py: parser.add_argument('rodata', type=argparse.FileType('rb'), help='input .rodata file path')
    ./catboost-1.2.5.tar.gz: catboost-1.2.5/catboost_all_src/build/scripts/rodata2cpp.py: parser.add_argument('cpp', type=argparse.FileType('w', encoding='UTF-8'), help='destination .cpp file path')
    ./icalendar-5.0.13.tar.gz: icalendar-5.0.13/src/icalendar/cli.py: parser.add_argument('--output', '-o', type=argparse.FileType('w'), default=sys.stdout, help='output file')
    ./img2pdf-0.5.1.tar.gz: img2pdf-0.5.1/src/img2pdf.py: type=argparse.FileType("wb"),
    ./facebook_business-20.0.0.tar.gz: facebook_business-20.0.0/examples/custom_audience_utils.py: create_group.add_argument('--file', type=argparse.FileType('rb'),
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/getArch.py: parser.add_argument('-targets', type=argparse.FileType('r'), help='input file with targets system to query Arch '
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/karmaSMB.py: parser.add_argument('-config', type=argparse.FileType('r'), metavar = 'pathname', help='config file name to map '
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/mimikatz.py: parser.add_argument('-file', type=argparse.FileType('r'), help='input file with commands to execute in the mini shell')
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/mssqlclient.py: parser.add_argument('-file', type=argparse.FileType('r'), help='input file with commands to execute in the SQL shell')
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/netview.py: parser.add_argument('-users', type=argparse.FileType('r'), help='input file with list of users to filter to output for')
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/netview.py: #parser.add_argument('-groups', type=argparse.FileType('r'), help='Filter output by members of the groups included in the input file')
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/netview.py: parser.add_argument('-targets', type=argparse.FileType('r'), help='input file with targets system to query info '
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/smbclient.py: parser.add_argument('-file', type=argparse.FileType('r'), help='input file with commands to execute in the mini shell')
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/wmipersist.py: install_parser.add_argument('-vbs', type=argparse.FileType('r'), required=True, help='VBS filename containing the '
    ./impacket-0.11.0.tar.gz: impacket-0.11.0/examples/wmiquery.py: parser.add_argument('-file', type=argparse.FileType('r'), help='input file with commands to execute in the WQL shell')
    ./fairseq-0.12.2.tar.gz: fairseq-0.12.2/fairseq/examples/speech_recognition/datasets/asr_prep_json.py: type=argparse.FileType("r", encoding="UTF-8"),
    ./fairseq-0.12.2.tar.gz: fairseq-0.12.2/fairseq/examples/speech_recognition/datasets/asr_prep_json.py: type=argparse.FileType("r", encoding="UTF-8"),
    ./fairseq-0.12.2.tar.gz: fairseq-0.12.2/fairseq/examples/speech_recognition/datasets/asr_prep_json.py: type=argparse.FileType("r", encoding="UTF-8"),
    ./fairseq-0.12.2.tar.gz: fairseq-0.12.2/fairseq/examples/speech_recognition/datasets/asr_prep_json.py: type=argparse.FileType("w"),
    ./josepy-1.14.0.tar.gz: josepy-1.14.0/src/josepy/jws.py: parser_sign.add_argument("-k", "--key", type=argparse.FileType("rb"), required=True)
    ./josepy-1.14.0.tar.gz: josepy-1.14.0/src/josepy/jws.py: parser_verify.add_argument("-k", "--key", type=argparse.FileType("rb"), required=False)
    ./lookml-3.0.3.tar.gz: lookml-3.0.3/lookml/lkml/__init__.py: "file", type=argparse.FileType("r"), help="path to the LookML file to parse"
    ./guesslang-2.2.1.tar.gz: guesslang-2.2.1/guesslang/__main__.py: from argparse import ArgumentParser, FileType
    ./gvm_tools-24.6.0.tar.gz: gvm_tools-24.6.0/scripts/update-task-target.gmp.py: from argparse import ArgumentParser, FileType, Namespace, RawTextHelpFormatter
    ./genson-1.3.0.tar.gz: genson-1.3.0/genson/__main__.py: file_type = argparse.FileType('r', encoding=self._get_encoding())
    ./mapbox_vector_tile-2.1.0.tar.gz: mapbox_vector_tile-2.1.0/mapbox_vector_tile/optimise.py: parser.add_argument("input_file", help="Input MVT file", type=argparse.FileType("r"))
    ./mapbox_vector_tile-2.1.0.tar.gz: mapbox_vector_tile-2.1.0/mapbox_vector_tile/optimise.py: "--output-file", help="Output file, default is stdout", type=argparse.FileType("w"), default=sys.stdout
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_diff: parser.add_argument('left', nargs='?', type=argparse.FileType('rb'),
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_diff: 'right', nargs='?', type=argparse.FileType('rb'),
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_diff: '--output', '-o', type=argparse.FileType('wb'), metavar='FILE',
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_patch: parser.add_argument('struc', nargs='?', type=argparse.FileType('rb'),
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_patch: 'diff', nargs='?', type=argparse.FileType('rb'),
    ./json_delta-2.0.2.tar.gz: json_delta-2.0.2/src/json_patch: '--output', '-o', type=argparse.FileType('wb'),
    ./json_spec-0.12.0.tar.gz: json_spec-0.12.0/src/jsonspec/cli.py: class JSONFile(argparse.FileType):
    ./jsonpatch-1.33.tar.gz: jsonpatch-1.33/bin/jsondiff: parser.add_argument('FILE1', type=argparse.FileType('r'))
    ./jsonpatch-1.33.tar.gz: jsonpatch-1.33/bin/jsondiff: parser.add_argument('FILE2', type=argparse.FileType('r'))
    ./jsonpatch-1.33.tar.gz: jsonpatch-1.33/bin/jsonpatch: parser.add_argument('ORIGINAL', type=argparse.FileType('r'),
    ./jsonpatch-1.33.tar.gz: jsonpatch-1.33/bin/jsonpatch: parser.add_argument('PATCH', type=argparse.FileType('r'),
    ./markdownify-0.12.1.tar.gz: markdownify-0.12.1/markdownify/main.py: parser.add_argument('html', nargs='?', type=argparse.FileType('r'),
    ./jsonpointer-3.0.0.tar.gz: jsonpointer-3.0.0/bin/jsonpointer: ptr_group.add_argument('-f', '--pointer-file', type=argparse.FileType('r'),
    ./jsonpointer-3.0.0.tar.gz: jsonpointer-3.0.0/bin/jsonpointer: parser.add_argument('FILE', type=argparse.FileType('r'), nargs='+',
    ./bandit-1.7.9.tar.gz: bandit-1.7.9/bandit/cli/main.py: type=argparse.FileType("w", encoding="utf-8"),
    ./base58-2.1.1.tar.gz: base58-2.1.1/base58/__main__.py: type=argparse.FileType('r'),
    ./langid-1.1.6.tar.gz: langid-1.1.6/langid/tools/printfeats.py: parser.add_argument('--output', "-o", default=sys.stdout, type=argparse.FileType('w'), help = "write to OUTPUT")
    ./lark-1.1.9.tar.gz: lark-1.1.9/lark/tools/__init__.py: from argparse import ArgumentParser, FileType
    ./lark-1.1.9.tar.gz: lark-1.1.9/lark/tools/__init__.py: lalr_argparser.add_argument('-o', '--out', type=FileType('w', encoding=encoding), default=sys.stdout, help='the output file (default=stdout)')
    ./lark-1.1.9.tar.gz: lark-1.1.9/lark/tools/__init__.py: lalr_argparser.add_argument('grammar_file', type=FileType('r', encoding=encoding), help='A valid .lark file')
    ./lark-parser-0.12.0.tar.gz: lark-parser-0.12.0/lark/tools/__init__.py: from argparse import ArgumentParser, FileType
    ./lark-parser-0.12.0.tar.gz: lark-parser-0.12.0/lark/tools/__init__.py: lalr_argparser.add_argument('-o', '--out', type=FileType('w', **k), default=sys.stdout, help='the output file (default=stdout)')
    ./lark-parser-0.12.0.tar.gz: lark-parser-0.12.0/lark/tools/__init__.py: lalr_argparser.add_argument('grammar_file', type=FileType('r', **k), help='A valid .lark file')
    ./ldaptor-21.2.0.tar.gz: ldaptor-21.2.0/docs/source/examples/client_paged_search_results.py: type=argparse.FileType("r"),
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/compiler/_data_passing_using_volume.py: type=argparse.FileType('r'),
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/compiler/_data_passing_using_volume.py: type=argparse.FileType('w'),
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/components/_python_op.py: return "argparse.FileType('rt')"
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/components/_python_op.py: return "argparse.FileType('rb')"
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/components/_python_op.py: # For Output* we cannot use the build-in argparse.FileType objects since they do not create parent directories.
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/components/_python_op.py: # ~= return "argparse.FileType('wt')"
    ./kfp-2.8.0.tar.gz: kfp-2.8.0/kfp/deprecated/components/_python_op.py: # ~= return "argparse.FileType('wb')"
    ./lkml-1.3.4.tar.gz: lkml-1.3.4/lkml/__init__.py: "file", type=argparse.FileType("r"), help="path to the LookML file to parse"
    ./myst_parser-3.0.1.tar.gz: myst_parser-3.0.1/myst_parser/cli.py: type=argparse.FileType("r", encoding="utf8"),
    ./myst_parser-3.0.1.tar.gz: myst_parser-3.0.1/myst_parser/cli.py: type=argparse.FileType("w", encoding="utf8"),
    ./cbor2-5.6.4.tar.gz: cbor2-5.6.4/cbor2/tool.py: type=argparse.FileType("rb"),
    ./netmiko-4.3.0.tar.gz: netmiko-4.3.0/netmiko/cli_tools/netmiko_cfg.py: "--infile", help="Read commands from file", type=argparse.FileType("r")
    ./cchardet-2.1.7.tar.gz: cchardet-2.1.7/bin/cchardetect: type=argparse.FileType('rb'),
    ./msg_parser-1.2.0.tar.gz: msg_parser-1.2.0/msg_parser/cli.py: from argparse import FileType
    ./mkdocs_get_deps-0.2.0.tar.gz: mkdocs_get_deps-0.2.0/mkdocs_get_deps/__main__.py: type=argparse.FileType("r"),
    ./poetry_core-1.9.0.tar.gz: poetry_core-1.9.0/src/poetry/core/_vendor/lark/tools/__init__.py: from argparse import ArgumentParser, FileType
    ./poetry_core-1.9.0.tar.gz: poetry_core-1.9.0/src/poetry/core/_vendor/lark/tools/__init__.py: lalr_argparser.add_argument('-o', '--out', type=FileType('w', encoding=encoding), default=sys.stdout, help='the output file (default=stdout)')
    ./poetry_core-1.9.0.tar.gz: poetry_core-1.9.0/src/poetry/core/_vendor/lark/tools/__init__.py: lalr_argparser.add_argument('grammar_file', type=FileType('r', encoding=encoding), help='A valid .lark file')
    ./hsms-0.3.1.tar.gz: hsms-0.3.1/hsms/cmds/hsms.py: type=argparse.FileType("r"),
    ./pyarmor-8.5.10.zip: pyarmor-8.5.10/pyarmor/polyfills/argparse.py: '--log', default=sys.stdout, type=argparse.FileType('w'),
    ./httpie-3.2.2.tar.gz: httpie-3.2.2/httpie/cli/definition.py: from argparse import FileType
    ./msoffcrypto_tool-5.4.1.tar.gz: msoffcrypto_tool-5.4.1/msoffcrypto/__main__.py: parser.add_argument("infile", nargs="?", type=argparse.FileType("rb"), help="input file")
    ./msoffcrypto_tool-5.4.1.tar.gz: msoffcrypto_tool-5.4.1/msoffcrypto/__main__.py: parser.add_argument("outfile", nargs="?", type=argparse.FileType("wb"), help="output file (if blank, stdout is used)")
    ./oslo.log-6.0.0.tar.gz: oslo.log-6.0.0/oslo_log/cmds/convert_json.py: type=argparse.FileType(),
    ./pybase64-1.3.2.tar.gz: pybase64-1.3.2/src/pybase64/__main__.py: "input", type=argparse.FileType("rb"), help="input file used for the benchmark"
    ./pybase64-1.3.2.tar.gz: pybase64-1.3.2/src/pybase64/__main__.py: "input", type=argparse.FileType("rb"), help="input file to be encoded"
    ./pybase64-1.3.2.tar.gz: pybase64-1.3.2/src/pybase64/__main__.py: type=argparse.FileType("wb"),
    ./pybase64-1.3.2.tar.gz: pybase64-1.3.2/src/pybase64/__main__.py: "input", type=argparse.FileType("rb"), help="input file to be decoded"
    ./pybase64-1.3.2.tar.gz: pybase64-1.3.2/src/pybase64/__main__.py: type=argparse.FileType("wb"),
    ./polyglot-16.7.4.tar.gz: polyglot-16.7.4/polyglot/__main__.py: from argparse import ArgumentParser, FileType
    ./pykafka-2.8.0.tar.gz: pykafka-2.8.0/pykafka/cli/kafka_tools.py: type=argparse.FileType('w'), default=sys.stdout)
    ./portalocker-2.10.0.tar.gz: portalocker-2.10.0/portalocker/__main__.py: type=argparse.FileType('w'),
    ./pdfplumber-0.11.1.tar.gz: pdfplumber-0.11.1/pdfplumber/cli.py: "infile", nargs="?", type=argparse.FileType("rb"), default=sys.stdin.buffer
    ./pykakasi-2.3.0.tar.gz: pykakasi-2.3.0/src/pykakasi/cli.py: "-I", type=argparse.FileType("r"), default=sys.stdin, help="Specify input file (default STDIN)"
    ./pykakasi-2.3.0.tar.gz: pykakasi-2.3.0/src/pykakasi/cli.py: "-O", type=argparse.FileType("w"), default=sys.stdout, help="Specify output file (default STDOUT)"
    ./pyLDAvis-3.4.1.tar.gz: pyLDAvis-3.4.1/pyLDAvis/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py: type=argparse.FileType("rb"),
    ./pex-2.6.2.tar.gz: pex-2.6.2/pex/vendor/_vendored/pip/pip/_vendor/chardet/cli/chardetect.py: type=argparse.FileType('rb'), nargs='*',
    ./pytest_split-0.9.0.tar.gz: pytest_split-0.9.0/src/pytest_split/cli.py: type=argparse.FileType(),
    ./pandoc-2.3.tar.gz: pandoc-2.3/src/pandoc/__init__.py: # TODO: use argparse.FileType and access the filename attribute when needed.
    ./pglast-6.2.tar.gz: pglast-6.2/pglast/__main__.py: parser.add_argument('infile', nargs='?', type=argparse.FileType(),
    ./pglast-6.2.tar.gz: pglast-6.2/pglast/__main__.py: parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
    ./pytype-2024.4.11.tar.gz: pytype-2024.4.11/pytype/tools/traces/run.py: parser.add_argument('input', type=argparse.FileType('r'),
    ./pyocd-0.36.0.tar.gz: pyocd-0.36.0/pyocd/subcommands/commander_cmd.py: type=argparse.FileType('r'),
    ./parliament-1.6.2.tar.gz: parliament-1.6.2/parliament/cli.py: type=argparse.FileType("r"),
    ./python-lsp-server-1.11.0.tar.gz: python-lsp-server-1.11.0/scripts/jsonschema2md.py: from argparse import ArgumentParser, FileType
    ./pickle5-0.0.12.tar.gz: pickle5-0.0.12/pickle5/pickle.py: 'pickle_file', type=argparse.FileType('br'),
    ./pickle5-0.0.12.tar.gz: pickle5-0.0.12/pickle5/pickletools.py: 'pickle_file', type=argparse.FileType('br'),
    ./pickle5-0.0.12.tar.gz: pickle5-0.0.12/pickle5/pickletools.py: '-o', '--output', default=sys.stdout, type=argparse.FileType('w'),
    ./premailer-3.10.0.tar.gz: premailer-3.10.0/premailer/__main__.py: type=argparse.FileType("r"),
    ./premailer-3.10.0.tar.gz: premailer-3.10.0/premailer/__main__.py: type=argparse.FileType("w"),
    ./pigar-2.1.4.tar.gz: pigar-2.1.4/pigar/_vendor/pip/_vendor/chardet/cli/chardetect.py: type=argparse.FileType("rb"),
    ./robotframework_robocop-5.3.0.tar.gz: robotframework_robocop-5.3.0/robocop/config.py: type=argparse.FileType("w"),
    ./rpaframework-28.6.0.tar.gz: rpaframework-28.6.0/src/RPA/scripts/crypto.py: "input", nargs="?", type=argparse.FileType("r"), default=sys.stdin
    ./rpaframework-28.6.0.tar.gz: rpaframework-28.6.0/src/RPA/scripts/crypto.py: type=argparse.FileType("rb"),
    ./rpaframework-28.6.0.tar.gz: rpaframework-28.6.0/src/RPA/scripts/crypto.py: type=argparse.FileType("wb"),
    ./rpaframework-28.6.0.tar.gz: rpaframework-28.6.0/src/RPA/scripts/crypto.py: type=argparse.FileType("rb"),
    ./rpaframework-28.6.0.tar.gz: rpaframework-28.6.0/src/RPA/scripts/crypto.py: type=argparse.FileType("wb"),
    ./pydicom-2.4.4.tar.gz: pydicom-2.4.4/pydicom/util/codify.py: type=argparse.FileType("w", encoding="UTF-8"),
    ./prov-2.0.1.tar.gz: prov-2.0.1/scripts/prov-compare: from argparse import ArgumentParser, RawDescriptionHelpFormatter, FileType
    ./prov-2.0.1.tar.gz: prov-2.0.1/scripts/prov-convert: from argparse import ArgumentParser, RawDescriptionHelpFormatter, FileType
    ./pypng-0.20220715.0.tar.gz: pypng-0.20220715.0/code/prichunkpng: type=argparse.FileType("rb"),
    ./pypng-0.20220715.0.tar.gz: pypng-0.20220715.0/code/priplan9topng: type=argparse.FileType("w"),
    ./pip_audit-2.7.3.tar.gz: pip_audit-2.7.3/pip_audit/_cli.py: to avoid `argparse.FileType`'s "eager" file creation, which is generally
    ./pip_audit-2.7.3.tar.gz: pip_audit-2.7.3/pip_audit/_cli.py: type=argparse.FileType("r"),
    ./PyNaCl-1.5.0.tar.gz: PyNaCl-1.5.0/docs/vectors/python/argondriver.py: type=argparse.FileType("w"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="r"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="rb"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="w"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="r"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="rb"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="w"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="rb"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="rb"),
    ./python_jsonpath-1.1.1.tar.gz: python_jsonpath-1.1.1/jsonpath/cli.py: type=argparse.FileType(mode="w"),
    ./pipenv-2024.0.1.tar.gz: pipenv-2024.0.1/pipenv/patched/pip/_vendor/chardet/cli/chardetect.py: type=argparse.FileType("rb"),
    ./pyzstd-0.16.0.tar.gz: pyzstd-0.16.0/src/__main__.py: g.add_argument('-D', '--dict', metavar='FILE', type=argparse.FileType('rb'),
    ./pyfaidx-0.8.1.1.tar.gz: pyfaidx-0.8.1.1/pyfaidx/cli.py: _input.add_argument('-b', '--bed', type=argparse.FileType('r'), help="bed file of regions (zero-based start coordinate)")
    ./pyfaidx-0.8.1.1.tar.gz: pyfaidx-0.8.1.1/pyfaidx/cli.py: output.add_argument('-o', '--out', type=argparse.FileType('w'), help="output file name (default: stdout)")
    ./python_snappy-0.7.2.tar.gz: python_snappy-0.7.2/src/snappy/__main__.py: type=argparse.FileType(mode='rb'),
    ./python_snappy-0.7.2.tar.gz: python_snappy-0.7.2/src/snappy/__main__.py: type=argparse.FileType(mode='wb'),
    ./pytest-benchmark-4.0.0.tar.gz: pytest-benchmark-4.0.0/src/pytest_benchmark/plugin.py: metavar="PATH", type=argparse.FileType('wb'),
    ./oci-2.129.0.tar.gz: oci-2.129.0/src/oci/_vendor/chardet/cli/chardetect.py: type=argparse.FileType('rb'), nargs='*',
    ./rule_engine-4.5.0.tar.gz: rule_engine-4.5.0/lib/rule_engine/debug_repl.py: type=argparse.FileType('r'),
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/ftconf.py: from argparse import ArgumentParser, FileType
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/ftdi_urls.py: from argparse import ArgumentParser, FileType
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/ftdi_urls.py: argparser.add_argument('-V', '--virtual', type=FileType('r'),
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/i2cscan.py: from argparse import ArgumentParser, FileType
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/i2cscan.py: argparser.add_argument('-V', '--virtual', type=FileType('r'),
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/pyterm.py: from argparse import ArgumentParser, FileType
    ./pyftdi-0.55.4.tar.gz: pyftdi-0.55.4/pyftdi/bin/pyterm.py: argparser.add_argument('-V', '--virtual', type=FileType('r'),
    ./srt-3.5.3.tar.gz: srt-3.5.3/srt_tools/utils.py: # Cannot use argparse.FileType as we need to know the encoding from the
    ./stanza-1.8.2.tar.gz: stanza-1.8.2/stanza/server/main.py: parser.add_argument('-i', '--input', type=argparse.FileType('r'), default=sys.stdin, help="Input file to process; each line contains one document (default: stdin)")
    ./stanza-1.8.2.tar.gz: stanza-1.8.2/stanza/server/main.py: parser.add_argument('-o', '--output', type=argparse.FileType('w'), default=sys.stdout, help="File to write annotations to (default: stdout)")
    ./unidiff-0.7.5.tar.gz: unidiff-0.7.5/bin/unidiff: type=argparse.FileType('r'),
    ./stix2-patterns-2.0.0.tar.gz: stix2-patterns-2.0.0/stix2patterns/validator.py: type=argparse.FileType("r"))
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/asm.py: type=argparse.FileType('wb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/asm.py: type=argparse.FileType('r')
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/checksec.py: type=argparse.FileType('rb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/checksec.py: type=argparse.FileType('rb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/debug.py: type=argparse.FileType('r'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/disablenx.py: type=argparse.FileType('rb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/phd.py: type=argparse.FileType('rb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/pwnstrip.py: p.add_argument('-o', '--output', type=argparse.FileType('wb'), default=getattr(sys.stdout, 'buffer', sys.stdout))
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/pwnstrip.py: p.add_argument('file', type=argparse.FileType('rb'))
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/scramble.py: type=argparse.FileType('wb'),
    ./pwntools-4.12.0.tar.gz: pwntools-4.12.0/pwnlib/commandline/shellcraft.py: type = argparse.FileType('wb'),
    ./urlextract-1.9.0.tar.gz: urlextract-1.9.0/urlextract/urlextract_core.py: type=argparse.FileType(),
    ./textile-4.0.2.tar.gz: textile-4.0.2/textile/__main__.py: parser.add_argument('infile', nargs='?', type=argparse.FileType(),
    ./textile-4.0.2.tar.gz: textile-4.0.2/textile/__main__.py: parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
    ./textract-1.6.5.tar.gz: textract-1.6.5/textract/cli.py: class FileType(argparse.FileType):
    ./readme_renderer-43.0.tar.gz: readme_renderer-43.0/readme_renderer/__main__.py: type=argparse.FileType('w'), default='-')
    ./wordcloud-1.9.3.tar.gz: wordcloud-1.9.3/wordcloud/wordcloud_cli.py: '--mask', metavar='file', type=argparse.FileType('rb'),
    ./wordcloud-1.9.3.tar.gz: wordcloud-1.9.3/wordcloud/wordcloud_cli.py: '--colormask', metavar='file', type=argparse.FileType('rb'),
    ./striprtf-0.0.26.tar.gz: striprtf-0.0.26/striprtf/striprtf: type=argparse.FileType("r", encoding="UTF-8"),
    ./tyro-0.8.5.tar.gz: tyro-0.8.5/src/tyro/_argparse.py: '--log', default=sys.stdout, type=argparse.FileType('w'),
    ./tyro-0.8.5.tar.gz: tyro-0.8.5/src/tyro/_arguments.py: type: Callable[[str], _T] | argparse.FileType | None = None,
    ./validate_pyproject-0.18.tar.gz: validate_pyproject-0.18/src/validate_pyproject/cli.py: _STDIN = argparse.FileType("r")("-")
    ./validate_pyproject-0.18.tar.gz: validate_pyproject-0.18/src/validate_pyproject/cli.py: type=argparse.FileType("r"),
    ./sphinxcontrib-openapi-0.8.4.tar.gz: sphinxcontrib-openapi-0.8.4/sphinxcontrib/openapi/__main__.py: type=argparse.FileType('w'),
    ./vcstool-0.3.0.tar.gz: vcstool-0.3.0/vcstool/commands/import_.py: return argparse.FileType('r')(value)
    ./vcstool-0.3.0.tar.gz: vcstool-0.3.0/vcstool/commands/validate.py: '--input', type=argparse.FileType('r'), default='-')
    ./tabcmd-2.0.14.tar.gz: tabcmd-2.0.14/tabcmd/execution/global_options.py: type=argparse.FileType("r", encoding="utf-8-sig"),
    ./tabcmd-2.0.14.tar.gz: tabcmd-2.0.14/tabcmd/execution/global_options.py: type=argparse.FileType("r", encoding="utf-8-sig"),
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/onnx/bin/checker.py: parser.add_argument("model_pb", type=argparse.FileType("rb"))
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/onnx/bin/checker.py: parser.add_argument("node_pb", type=argparse.FileType("rb"))
    ./tecton-0.9.12.tar.gz: tecton-0.9.12/tecton/vendor/dill/dill/_objects.py: a['ArgParseFileType'] = argparse.FileType() # pickle ok
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-1.16.1.tar.gz: onnx-1.16.1/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/codegen/operation.py: type=argparse.FileType('w'),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/codegen/operation.py: type=argparse.FileType('r', encoding=read_encoding),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/codegen/operation.py: type=argparse.FileType('r', encoding=read_encoding),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/codegen/schema.py: type=argparse.FileType('r', encoding=read_encoding),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/codegen/schema.py: type=argparse.FileType('w'),
    ./sgqlc-16.3.tar.gz: sgqlc-16.3/sgqlc/introspection/__main__.py: type=argparse.FileType('w'),
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/onnx/bin/checker.py: parser.add_argument("model_pb", type=argparse.FileType("rb"))
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/onnx/bin/checker.py: parser.add_argument("node_pb", type=argparse.FileType("rb"))
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnx-simplifier-0.4.36.tar.gz: onnx-simplifier-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./truffleHog-2.2.1.tar.gz: truffleHog-2.2.1/truffleHog/truffleHog.py: parser.add_argument('-i', '--include_paths', type=argparse.FileType('r'), metavar='INCLUDE_PATHS_FILE',
    ./truffleHog-2.2.1.tar.gz: truffleHog-2.2.1/truffleHog/truffleHog.py: parser.add_argument('-x', '--exclude_paths', type=argparse.FileType('r'), metavar='EXCLUDE_PATHS_FILE',
    ./vowpalwabbit-9.9.0.tar.gz: vowpalwabbit-9.9.0/utl/csv2vw: #    type=argparse.FileType('r'),
    ./xmljson-0.2.1.tar.gz: xmljson-0.2.1/xmljson/__main__.py: parser.add_argument('in_file', type=argparse.FileType(), nargs='?', default=in_file,
    ./xmljson-0.2.1.tar.gz: xmljson-0.2.1/xmljson/__main__.py: parser.add_argument('-o', '--out_file', type=argparse.FileType('w'), default=out_file,
    ./wavedrom-2.0.3.post3.tar.gz: wavedrom-2.0.3.post3/wavedrom/__init__.py: required=True, type=argparse.FileType('r'))
    ./wavedrom-2.0.3.post3.tar.gz: wavedrom-2.0.3.post3/wavedrom/__init__.py: nargs='?', type=argparse.FileType('w'), default=sys.stdout)
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/onnx/bin/checker.py: parser.add_argument("model_pb", type=argparse.FileType("rb"))
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/onnx/bin/checker.py: parser.add_argument("node_pb", type=argparse.FileType("rb"))
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxoptimizer-0.3.13.tar.gz: onnxoptimizer-0.3.13/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./yq-3.4.3.tar.gz: yq-3.4.3/yq/__init__.py: args.input_streams.insert(0, argparse.FileType()(args.jq_filter))
    ./yq-3.4.3.tar.gz: yq-3.4.3/yq/parser.py: parser.add_argument("input_streams", nargs="*", type=argparse.FileType(), metavar="files", default=[])
    ./zcbor-0.8.1.tar.gz: zcbor-0.8.1/zcbor/zcbor.py: from argparse import ArgumentParser, ArgumentTypeError, RawDescriptionHelpFormatter, FileType
    ./zconfig-4.1.tar.gz: zconfig-4.1/src/ZConfig/_schema_utils.py: schema_reader = argparse.FileType('r')(schema)
    ./zconfig-4.1.tar.gz: zconfig-4.1/src/ZConfig/schema2html.py: type=argparse.FileType('w'),
    ./zconfig-4.1.tar.gz: zconfig-4.1/src/ZConfig/validator.py: type=argparse.FileType('r'),
    ./zigpy_znp-0.12.2.tar.gz: zigpy_znp-0.12.2/zigpy_znp/tools/common.py: class ClosableFileType(argparse.FileType):
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/onnx/bin/checker.py: parser.add_argument("model_pb", type=argparse.FileType("rb"))
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/onnx/bin/checker.py: parser.add_argument("node_pb", type=argparse.FileType("rb"))
    ./zodbpickle-4.0.tar.gz: zodbpickle-4.0/src/zodbpickle/pickle_3.py: 'pickle_file', type=argparse.FileType('br'),
    ./zodbpickle-4.0.tar.gz: zodbpickle-4.0/src/zodbpickle/pickletools_3.py: 'pickle_file', type=argparse.FileType('br'),
    ./zodbpickle-4.0.tar.gz: zodbpickle-4.0/src/zodbpickle/pickletools_3.py: '-o', '--output', default=sys.stdout, type=argparse.FileType('w'),
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    ./onnxsim-0.4.36.tar.gz: onnxsim-0.4.36/third_party/onnx-optimizer/third_party/onnx/third_party/benchmark/tools/compare.py: type=argparse.FileType('r'),
    
    Time: 0:00:25.608394
    Found 384 matching lines in 138 projects

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error
    Projects
    Status: Doc issues
    Development

    Successfully merging a pull request may close this issue.

    7 participants