{ lib, stdenv, callPackage, pythonPackagesExtensions, config, makeScopeWithSplicing', pythonBase, ... }: { implementation, libPrefix, executable, sourceVersion, pythonVersion, packageOverrides, sitePackages, hasDistutilsCxxPatch, pythonOnBuildForBuild, pythonOnBuildForHost, pythonOnBuildForTarget, pythonOnHostForHost, pythonOnTargetForTarget, pythonAttr ? null, self, # is pythonOnHostForTarget }: let pythonPackages = let ensurePythonModules = items: let exceptions = [ stdenv ]; providesSetupHook = lib.attrByPath [ "provides" "setupHook" ] false; valid = value: pythonPackages.hasPythonModule value || providesSetupHook value || lib.elem value exceptions; func = name: value: if lib.isDerivation value then lib.extendDerivation ( valid value || throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set." ) { } value else value; in lib.mapAttrs func items; in ensurePythonModules ( callPackage # Function that when called # - imports python-packages.nix # - adds spliced package sets to the package set # - applies overrides from `packageOverrides` and `pythonPackagesOverlays`. ( { pkgs, stdenv, python, overrides, }: let pythonPackagesFun = import "${pythonBase}/python-packages-base.nix" { inherit stdenv pkgs lib; python = self; }; otherSplices = { selfBuildBuild = pythonOnBuildForBuild.pkgs; selfBuildHost = pythonOnBuildForHost.pkgs; selfBuildTarget = pythonOnBuildForTarget.pkgs; selfHostHost = pythonOnHostForHost.pkgs; selfTargetTarget = pythonOnTargetForTarget.pkgs or { }; # There is no Python TargetTarget. }; hooks = self: dontUse: (import "${pythonBase}/hooks/default.nix" self dontUse) // (overrides self dontUse).hookOverrides; keep = self: hooks self { }; optionalExtensions = cond: as: lib.optionals cond as; pythonExtension = import "${pythonBase}/../../../top-level/python-packages.nix"; python2Extension = import "${pythonBase}/../../../top-level/python2-packages.nix"; extensions = lib.composeManyExtensions ( [ hooks pythonExtension ] ++ (optionalExtensions (!self.isPy3k) [ python2Extension ]) ++ pythonPackagesExtensions ++ [ overrides ] ); aliases = self: super: lib.optionalAttrs config.allowAliases (import "${pythonBase}/../../../top-level/python-aliases.nix" lib self super); in makeScopeWithSplicing' { inherit otherSplices keep; f = lib.extends (lib.composeExtensions aliases extensions) pythonPackagesFun; } ) { overrides = packageOverrides; python = self; } ); in rec { isPy26 = pythonVersion == "2.6"; isPy27 = pythonVersion == "2.7"; isPy37 = pythonVersion == "3.7"; isPy38 = pythonVersion == "3.8"; isPy39 = pythonVersion == "3.9"; isPy310 = pythonVersion == "3.10"; isPy311 = pythonVersion == "3.11"; isPy312 = pythonVersion == "3.12"; isPy313 = pythonVersion == "3.13"; isPy314 = pythonVersion == "3.14"; isPy2 = lib.strings.substring 0 1 pythonVersion == "2"; isPy3 = lib.strings.substring 0 1 pythonVersion == "3"; isPy3k = isPy3; isPyPy = lib.hasInfix "pypy" interpreter; buildEnv = callPackage "${pythonBase}/wrapper.nix" { python = self; inherit (pythonPackages) requiredPythonModules; }; withPackages = import "${pythonBase}/with-packages.nix" { inherit buildEnv pythonPackages; }; pkgs = pythonPackages; interpreter = "${self}/bin/${executable}"; inherit executable implementation libPrefix pythonVersion sitePackages ; inherit sourceVersion; pythonAtLeast = lib.versionAtLeast pythonVersion; pythonOlder = lib.versionOlder pythonVersion; inherit hasDistutilsCxxPatch; inherit pythonOnBuildForHost; tests = callPackage "${pythonBase}/tests.nix" { python = self; }; inherit pythonAttr; }