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

Use f-strings instead of str.format within importlib #82874

Closed
gpshead opened this issue Nov 5, 2019 · 11 comments
Closed

Use f-strings instead of str.format within importlib #82874

gpshead opened this issue Nov 5, 2019 · 11 comments
Assignees
Labels
3.12 bugs and security fixes performance Performance or resource usage topic-importlib

Comments

@gpshead
Copy link
Member

gpshead commented Nov 5, 2019

BPO 38693
Nosy @gpshead, @jaraco, @ericvsmith, @serhiy-storchaka, @csabella, @miss-islington, @tirkarthi, @FFY00
PRs
  • bpo-38693: Use f-strings instead of str.format() within importlib #17058
  • bpo-38693: importlib.metadata f-strings #26383
  • [3.10] bpo-38693: importlib.metadata f-strings (GH-26383) #26386
  • bpo-38693: Prefer f-strings in importlib.resources (importlib_resources 5.0.6). #26387
  • [3.10] bpo-38693: Prefer f-strings in importlib.resources (importlib_resources 5.0.6). (GH-26387) #26389
  • 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 = 'https://github.com/gpshead'
    closed_at = None
    created_at = <Date 2019-11-05.06:20:17.309>
    labels = ['3.11', 'performance']
    title = 'Use f-strings instead of str.format within importlib'
    updated_at = <Date 2021-05-26.21:09:35.360>
    user = 'https://github.com/gpshead'

    bugs.python.org fields:

    activity = <Date 2021-05-26.21:09:35.360>
    actor = 'jaraco'
    assignee = 'gregory.p.smith'
    closed = False
    closed_date = None
    closer = None
    components = []
    creation = <Date 2019-11-05.06:20:17.309>
    creator = 'gregory.p.smith'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 38693
    keywords = ['patch']
    message_count = 9.0
    messages = ['356005', '369672', '378998', '393617', '393629', '394453', '394454', '394460', '394463']
    nosy_count = 8.0
    nosy_names = ['gregory.p.smith', 'jaraco', 'eric.smith', 'serhiy.storchaka', 'cheryl.sabella', 'miss-islington', 'xtreak', 'FFY00']
    pr_nums = ['17058', '26383', '26386', '26387', '26389']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'performance'
    url = 'https://bugs.python.org/issue38693'
    versions = ['Python 3.11']

    @gpshead
    Copy link
    Member Author

    gpshead commented Nov 5, 2019

    importlib is full of str.format calls, modernizing it to use f-strings is a slight performance win and much more readable.

    @gpshead gpshead added 3.8 (EOL) end of life 3.9 only security fixes labels Nov 5, 2019
    @gpshead gpshead self-assigned this Nov 5, 2019
    @gpshead gpshead added the performance Performance or resource usage label Nov 5, 2019
    @csabella
    Copy link
    Contributor

    Did you want this one to land in 3.9?

    @gpshead gpshead added 3.10 only security fixes and removed 3.8 (EOL) end of life 3.9 only security fixes labels Oct 19, 2020
    @gpshead
    Copy link
    Member Author

    gpshead commented Oct 19, 2020

    Status: Waiting until after the importlib.metadata and importlib.resources backports drop support for both Python 2.7 and 3.5 as keeping them in sync would be a pain for maintainers (per jaraco on our sprint importlib-any chat today)

    @FFY00
    Copy link
    Member

    FFY00 commented May 13, 2021

    Both importlib_metadata and importlib_resources have dropped support for Python 2.7 and 3.5, this should now be unblocked.

    @serhiy-storchaka
    Copy link
    Member

    I just have merged a change which makes many C-style formatting as fast as f-strings (bpo-28307) and am working on supporting more format codes (%d, %x, %f, etc). Using C-style formatting can be a good option if you want performance and backward compatibility. It was faster than str.format() even without that optimization.

    @serhiy-storchaka serhiy-storchaka added 3.11 only security fixes and removed 3.10 only security fixes labels May 14, 2021
    @miss-islington
    Copy link
    Contributor

    New changeset e6c815d by Jason R. Coombs in branch 'main':
    bpo-38693: importlib.metadata f-strings (GH-26383)
    e6c815d

    @miss-islington
    Copy link
    Contributor

    New changeset 78a8428 by Miss Islington (bot) in branch '3.10':
    bpo-38693: importlib.metadata f-strings (GH-26383)
    78a8428

    @miss-islington
    Copy link
    Contributor

    New changeset f6fbdb9 by Jason R. Coombs in branch 'main':
    bpo-38693: Prefer f-strings in importlib.resources (importlib_resources 5.0.6). (GH-26387)
    f6fbdb9

    @jaraco
    Copy link
    Member

    jaraco commented May 26, 2021

    New changeset 97b4576 by Miss Islington (bot) in branch '3.10':
    bpo-38693: Prefer f-strings in importlib.resources (importlib_resources 5.0.6). (GH-26387) (bpo-26389)
    97b4576

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    @iritkatriel iritkatriel added 3.12 bugs and security fixes and removed 3.11 only security fixes labels Aug 26, 2022
    @gpshead
    Copy link
    Member Author

    gpshead commented Oct 6, 2022

    #17058 did this for Lib/importlib/_bootstrap.py

    @gpshead
    Copy link
    Member Author

    gpshead commented Oct 6, 2022

    remaining things to consider (not all need to be converted):

    $ grep -R '[.]format' Lib/importlib/
    Lib/importlib/_bootstrap_external.py:    path_tmp = '{}.{}'.format(path, id(path))
    Lib/importlib/_bootstrap_external.py:            raise ValueError('{!r} is not alphanumeric'.format(optimization))
    Lib/importlib/_bootstrap_external.py:        almost_filename = '{}.{}{}'.format(almost_filename, _OPT, optimization)
    Lib/importlib/_bootstrap_external.py:        _warnings.warn(msg.format(portions[0]), ImportWarning)
    Lib/importlib/_bootstrap_external.py:        raise ImportError('Non-code object in {!r}'.format(bytecode_path),
    Lib/importlib/_bootstrap_external.py:        key = registry_key.format(fullname=fullname,
    Lib/importlib/_bootstrap_external.py:                              'returns None'.format(module.__name__))
    Lib/importlib/_bootstrap_external.py:        return '_NamespacePath({!r})'.format(self._path)
    Lib/importlib/_bootstrap_external.py:                    new_name = '{}.{}'.format(name, suffix.lower())
    Lib/importlib/_bootstrap_external.py:        return 'FileFinder({!r})'.format(self.path)
    Lib/importlib/metadata/__init__.py:        return text and map('"{}"'.format, text.splitlines())
    Lib/importlib/resources/_adapters.py:        "Invalid mode value '{}', only 'r' and 'rb' are supported".format(mode)
    Lib/importlib/_bootstrap.py:        print(message.format(*args), file=sys.stderr)
    Lib/importlib/__init__.py:            raise ValueError('{}.__loader__ is None'.format(name))
    Lib/importlib/__init__.py:        raise ValueError('{}.__loader__ is not set'.format(name)) from None
    Lib/importlib/__init__.py:            raise ImportError('spec for {} missing loader'.format(name),
    Lib/importlib/__init__.py:            raise TypeError(msg.format(name))
    Lib/importlib/__init__.py:        raise ImportError(msg.format(name), name=name)
    Lib/importlib/__init__.py:                raise ImportError(msg.format(parent_name),
    Lib/importlib/util.py:            raise ValueError('{}.__spec__ is not set'.format(name)) from None
    Lib/importlib/util.py:                raise ValueError('{}.__spec__ is None'.format(name))
    Lib/importlib/util.py:            raise ValueError('{}.__spec__ is not set'.format(name)) from None
    Lib/importlib/util.py:                raise ValueError('{}.__spec__ is None'.format(name))
    

    @gpshead gpshead closed this as completed Oct 7, 2022
    carljm added a commit to carljm/cpython that referenced this issue Oct 8, 2022
    * main:
      pythongh-86298: Ensure that __loader__ and __spec__.loader agree in warnings.warn_explicit() (pythonGH-97803)
      pythongh-82874: Convert remaining importlib format uses to f-str. (python#98005)
      Docs: Fix backtick errors found by sphinx-lint (python#97998)
      pythongh-97850: Remove deprecated functions from `importlib.utils` (python#97898)
      Remove extra spaces in custom openSSL documentation. (python#93568)
      pythonGH-90985: Revert  "Deprecate passing a message into cancel()" (python#97999)
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.12 bugs and security fixes performance Performance or resource usage topic-importlib
    Projects
    None yet
    Development

    No branches or pull requests

    7 participants