Skip to content

Enhance test.support.os_helper.EnvironmentVarGuard interface #131277

Description

@picnixz

Feature or enhancement

Currently, we have a lot of pattern of the form:

with EnvironmentVarGuard() as env:
   if no_c in env:
       env.unset(no_c)
   if no_d in env:
       env.unset(no_d)
   for ev in {no_a, no_b}:
       if ev in env:
           env.unset(ev)

I think it makes sense to have something like this:

with EnvironmentVarGuard() as env:
   env.unset(no_a, no_b, no_c, no_d)  # unset many vars at once

or to also provide a decorator-based approach when the values to set/unset are statically known.

Features

  • Allow to unset multiple environment variables: env.unset(k1, k2, ...)

Some optional features that I rejected after looking at the use cases:

  • Allow to specify new environment variables at construction time (it could save a few lines when we're only modifying one or two envvars) [abandoned, not enough readable use cases]
  • Add decorator-based environment guard for EnvironmentVarGuard() [abandoned for now]

I plan to create a PR today or tomorrow to illustrate the new interface.

EDIT: no need to the support for setting multiple variables at once because EnvironmentVarGuard is a mapping, so it has .update() which does the trick.

Linked PRs

See #131277 (comment) for the version labels rationale and #131280 (comment) for the backporte rationale.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

3.12only security fixes3.13bugs and security fixes3.14bugs and security fixesstdlibStandard Library Python modules in the Lib/ directorytestsTests in the Lib/test dirtriagedThe issue has been accepted as valid by a triager.type-featureA feature request or enhancement

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions