From 23e5b391bbc9fc42c5de3984f3729c500832a335 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Tue, 14 May 2024 15:09:42 +0200 Subject: [PATCH] Use dict.items() instead of repeatedly getting the value Faster and shorter --- easybuild/framework/easyblock.py | 20 +++++++++---------- easybuild/framework/easyconfig/easyconfig.py | 10 +++++----- easybuild/tools/config.py | 6 +++--- easybuild/tools/docs.py | 4 ++-- easybuild/tools/environment.py | 4 ++-- easybuild/tools/github.py | 4 ++-- .../module_naming_scheme/hierarchical_mns.py | 4 ++-- easybuild/tools/multidiff.py | 4 ++-- easybuild/tools/options.py | 4 ++-- easybuild/tools/systemtools.py | 8 ++++---- easybuild/tools/testing.py | 4 ++-- easybuild/tools/toolchain/toolchain.py | 4 ++-- test/framework/easyconfig.py | 16 +++++++-------- 13 files changed, 46 insertions(+), 46 deletions(-) diff --git a/easybuild/framework/easyblock.py b/easybuild/framework/easyblock.py index 98d71475b0..670966b05d 100644 --- a/easybuild/framework/easyblock.py +++ b/easybuild/framework/easyblock.py @@ -2197,9 +2197,9 @@ def handle_iterate_opts(self): self.log.info("Current iteration index: %s", self.iter_idx) # pop first element from all iterative easyconfig parameters as next value to use - for opt in self.iter_opts: - if len(self.iter_opts[opt]) > self.iter_idx: - self.cfg[opt] = self.iter_opts[opt][self.iter_idx] + for opt, value in self.iter_opts.items(): + if len(value) > self.iter_idx: + self.cfg[opt] = value[self.iter_idx] else: self.cfg[opt] = '' # empty list => empty option as next value self.log.debug("Next value for %s: %s" % (opt, str(self.cfg[opt]))) @@ -2211,12 +2211,12 @@ def post_iter_step(self): """Restore options that were iterated over""" # disable templating, since we're messing about with values in self.cfg with self.cfg.disable_templating(): - for opt in self.iter_opts: - self.cfg[opt] = self.iter_opts[opt] + for opt, value in self.iter_opts.items(): + self.cfg[opt] = value # also need to take into account extensions, since those were iterated over as well for ext in self.ext_instances: - ext.cfg[opt] = self.iter_opts[opt] + ext.cfg[opt] = value self.log.debug("Restored value of '%s' that was iterated over: %s", opt, self.cfg[opt]) @@ -4661,14 +4661,14 @@ def inject_checksums_to_json(ecs, checksum_type): # actually inject new checksums or overwrite existing ones (if --force) existing_checksums = app.get_checksums_from_json(always_read=True) - for filename in checksums: + for filename, checksum in checksums.items(): if filename not in existing_checksums: - existing_checksums[filename] = checksums[filename] + existing_checksums[filename] = checksum # don't do anything if the checksum already exist and is the same - elif checksums[filename] != existing_checksums[filename]: + elif checksum != existing_checksums[filename]: if build_option('force'): print_warning("Found existing checksums for %s, overwriting them (due to --force)..." % ec_fn) - existing_checksums[filename] = checksums[filename] + existing_checksums[filename] = checksum else: raise EasyBuildError("Found existing checksum for %s, use --force to overwrite them" % filename) diff --git a/easybuild/framework/easyconfig/easyconfig.py b/easybuild/framework/easyconfig/easyconfig.py index 5f8170b748..9177338454 100644 --- a/easybuild/framework/easyconfig/easyconfig.py +++ b/easybuild/framework/easyconfig/easyconfig.py @@ -827,7 +827,7 @@ def check_deprecated(self, path): if depr_msgs: depr_msg = ', '.join(depr_msgs) - depr_maj_ver = int(str(VERSION).split('.')[0]) + 1 + depr_maj_ver = int(str(VERSION).split('.', maxsplit=1)[0]) + 1 depr_ver = '%s.0' % depr_maj_ver more_info_depr_ec = " (see also https://docs.easybuild.io/deprecated-easyconfigs)" @@ -842,8 +842,8 @@ def validate(self, check_osdeps=True): - check license """ self.log.info("Validating easyconfig") - for attr in self.validations: - self._validate(attr, self.validations[attr]) + for attr, valid_values in self.validations.items(): + self._validate(attr, valid_values) if check_osdeps: self.log.info("Checking OS dependencies") @@ -1207,8 +1207,8 @@ def dump(self, fp, always_overwrite=True, backup=False, explicit_toolchains=Fals # templated values should be dumped unresolved with self.disable_templating(): # build dict of default values - default_values = {key: DEFAULT_CONFIG[key][0] for key in DEFAULT_CONFIG} - default_values.update({key: self.extra_options[key][0] for key in self.extra_options}) + default_values = {key: value[0] for key, value in DEFAULT_CONFIG.items()} + default_values.update({key: value[0] for key, value in self.extra_options.items()}) self.generate_template_values() templ_const = {quote_py_str(const[1]): const[0] for const in TEMPLATE_CONSTANTS} diff --git a/easybuild/tools/config.py b/easybuild/tools/config.py index 8dea4e4f68..1864ec0dc0 100644 --- a/easybuild/tools/config.py +++ b/easybuild/tools/config.py @@ -592,12 +592,12 @@ def init_build_options(build_options=None, cmdline_options=None): # seed in defaults to make sure all build options are defined, and that build_option() doesn't fail on valid keys bo = {} for build_options_by_default in [BUILD_OPTIONS_CMDLINE, BUILD_OPTIONS_OTHER]: - for default in build_options_by_default: + for default, options in build_options_by_default.items(): if default == EMPTY_LIST: - for opt in build_options_by_default[default]: + for opt in options: bo[opt] = [] else: - bo.update({opt: default for opt in build_options_by_default[default]}) + bo.update({opt: default for opt in options}) bo.update(active_build_options) # BuildOptions is a singleton, so any future calls to BuildOptions will yield the same instance diff --git a/easybuild/tools/docs.py b/easybuild/tools/docs.py index 42d88616f0..ba57976f90 100644 --- a/easybuild/tools/docs.py +++ b/easybuild/tools/docs.py @@ -807,8 +807,8 @@ def list_software(output_format=FORMAT_TXT, detailed=False, only_installed=False # rebuild software, only retain entries with a corresponding available module software, all_software = {}, software - for key in all_software: - for entry in all_software[key]: + for key, entries in all_software.items(): + for entry in entries: if entry['mod_name'] in avail_mod_names: software.setdefault(key, []).append(entry) diff --git a/easybuild/tools/environment.py b/easybuild/tools/environment.py index a5cc708ce2..07f9ef6e50 100644 --- a/easybuild/tools/environment.py +++ b/easybuild/tools/environment.py @@ -54,8 +54,8 @@ def write_changes(filename): """ try: with open(filename, 'w') as script: - for key in _changes: - script.write('export %s=%s\n' % (key, shell_quote(_changes[key]))) + for key, changed_value in _changes.items(): + script.write('export %s=%s\n' % (key, shell_quote(changed_value))) except IOError as err: raise EasyBuildError("Failed to write to %s: %s", filename, err) reset_changes() diff --git a/easybuild/tools/github.py b/easybuild/tools/github.py index d1b93c3ad7..b1a8b69260 100644 --- a/easybuild/tools/github.py +++ b/easybuild/tools/github.py @@ -1029,8 +1029,8 @@ def _easyconfigs_pr_common(paths, ecs, start_branch=None, pr_branch=None, start_ # only consider new easyconfig files for dependencies (not updated ones) for idx in range(len(all_dep_info['ecs'])): if all_dep_info['new'][idx]: - for key in dep_info: - dep_info[key].append(all_dep_info[key][idx]) + for key, values in dep_info.items(): + values.append(all_dep_info[key][idx]) # checkout target branch if pr_branch is None: diff --git a/easybuild/tools/module_naming_scheme/hierarchical_mns.py b/easybuild/tools/module_naming_scheme/hierarchical_mns.py index d0e4ea5966..7b368e4cac 100644 --- a/easybuild/tools/module_naming_scheme/hierarchical_mns.py +++ b/easybuild/tools/module_naming_scheme/hierarchical_mns.py @@ -204,10 +204,10 @@ def det_modpath_extensions(self, ec): comp_name_ver = None if ec['name'] in extend_comps: - for key in COMP_NAME_VERSION_TEMPLATES: + for key, comp_tmpl in COMP_NAME_VERSION_TEMPLATES.items(): comp_names = key.split(',') if ec['name'] in comp_names: - comp_name, comp_ver_tmpl = COMP_NAME_VERSION_TEMPLATES[key] + comp_name, comp_ver_tmpl = comp_tmpl comp_versions = {ec['name']: self.det_full_version(ec)} if ec['name'] == 'ifort': # 'icc' key should be provided since it's the only one used in the template diff --git a/easybuild/tools/multidiff.py b/easybuild/tools/multidiff.py index 99ee949e56..b8a135bf2f 100644 --- a/easybuild/tools/multidiff.py +++ b/easybuild/tools/multidiff.py @@ -291,8 +291,8 @@ def multidiff(base, files, colored=True): offset -= 1 # construct the multi-diff based on the constructed dict - for line_no in local_diff: - for (line, filename) in local_diff[line_no]: + for line_no, line_infos in local_diff.items(): + for (line, filename) in line_infos: mdiff.parse_line(line_no, line.rstrip(), filename, squigly_dict.get(line, '').rstrip()) return str(mdiff) diff --git a/easybuild/tools/options.py b/easybuild/tools/options.py index f5d5c801a0..aa134fa706 100644 --- a/easybuild/tools/options.py +++ b/easybuild/tools/options.py @@ -1365,9 +1365,9 @@ def show_system_info(self): '', "* GPU:", ]) - for vendor in gpu_info: + for vendor, vendor_gpu in gpu_info.items(): lines.append(" -> %s" % vendor) - for gpu, num in gpu_info[vendor].items(): + for gpu, num in vendor_gpu.items(): lines.append(" -> %sx %s" % (num, gpu)) lines.extend([ diff --git a/easybuild/tools/systemtools.py b/easybuild/tools/systemtools.py index 73cba6f91a..b4e1c254da 100644 --- a/easybuild/tools/systemtools.py +++ b/easybuild/tools/systemtools.py @@ -1367,9 +1367,9 @@ def extract_version(tool): python_version = extract_version(sys.executable) opt_dep_versions = {} - for key in EASYBUILD_OPTIONAL_DEPENDENCIES: + for key, opt_dep in EASYBUILD_OPTIONAL_DEPENDENCIES.items(): - pkg = EASYBUILD_OPTIONAL_DEPENDENCIES[key][0] + pkg = opt_dep[0] if pkg is None: pkg = key.lower() @@ -1395,8 +1395,8 @@ def extract_version(tool): opt_deps_key = "Optional dependencies" checks_data[opt_deps_key] = {} - for key in opt_dep_versions: - checks_data[opt_deps_key][key] = (opt_dep_versions[key], EASYBUILD_OPTIONAL_DEPENDENCIES[key][1]) + for key, version in opt_dep_versions.items(): + checks_data[opt_deps_key][key] = (version, EASYBUILD_OPTIONAL_DEPENDENCIES[key][1]) sys_tools_key = "System tools" checks_data[sys_tools_key] = {} diff --git a/easybuild/tools/testing.py b/easybuild/tools/testing.py index 881788337e..dae8a51449 100644 --- a/easybuild/tools/testing.py +++ b/easybuild/tools/testing.py @@ -321,8 +321,8 @@ def post_pr_test_report(pr_nrs, repo_type, test_report, msg, init_session_state, gpu_info = get_gpu_info() gpu_str = "" if gpu_info: - for vendor in gpu_info: - for gpu, num in gpu_info[vendor].items(): + for vendor, vendor_gpu in gpu_info.items(): + for gpu, num in vendor_gpu.items(): gpu_str += ", %s x %s %s" % (num, vendor, gpu) os_info = '%(hostname)s - %(os_type)s %(os_name)s %(os_version)s' % system_info diff --git a/easybuild/tools/toolchain/toolchain.py b/easybuild/tools/toolchain/toolchain.py index c11fb309d3..17916de519 100644 --- a/easybuild/tools/toolchain/toolchain.py +++ b/easybuild/tools/toolchain/toolchain.py @@ -588,8 +588,8 @@ def _simulated_load_dependency_module(self, name, version, metadata, verbose=Fal self.log.debug("Defining $EB* environment variables for software named %s", name) env_vars = env_vars_external_module(name, version, metadata) - for key in env_vars: - setvar(key, env_vars[key], verbose=verbose) + for var, value in env_vars.items(): + setvar(var, value, verbose=verbose) def _load_toolchain_module(self, silent=False): """Load toolchain module.""" diff --git a/test/framework/easyconfig.py b/test/framework/easyconfig.py index fd34622a8e..274c8deb05 100644 --- a/test/framework/easyconfig.py +++ b/test/framework/easyconfig.py @@ -2168,8 +2168,8 @@ def test_external_dependencies_templates(self): 'pyshortver': '3.6', 'pyver': '3.6.5', } - for key in expected_template_values: - self.assertEqual(ec.template_values[key], expected_template_values[key]) + for key, expected in expected_template_values.items(): + self.assertEqual(ec.template_values[key], expected) self.assertEqual(ec['versionsuffix'], '-Python-3.6.5-Perl-5.30') @@ -2245,8 +2245,8 @@ def test_quote_str(self): 'foo\\bar': '"foo\\bar"', } - for t in teststrings: - self.assertEqual(quote_str(t), teststrings[t]) + for t, expected in teststrings.items(): + self.assertEqual(quote_str(t), expected) # test escape_newline self.assertEqual(quote_str("foo\nbar", escape_newline=False), '"foo\nbar"') @@ -4815,8 +4815,8 @@ def test_get_cuda_cc_template_value(self): update_build_option('cuda_compute_capabilities', ['6.5', '7.0']) ec = EasyConfig(self.eb_file) - for key in cuda_template_values: - self.assertEqual(ec.get_cuda_cc_template_value(key), cuda_template_values[key]) + for key, expected in cuda_template_values.items(): + self.assertEqual(ec.get_cuda_cc_template_value(key), expected) update_build_option('cuda_compute_capabilities', None) ec = EasyConfig(self.eb_file) @@ -4828,8 +4828,8 @@ def test_get_cuda_cc_template_value(self): self.prep() ec = EasyConfig(self.eb_file) - for key in cuda_template_values: - self.assertEqual(ec.get_cuda_cc_template_value(key), cuda_template_values[key]) + for key, expected in cuda_template_values.items(): + self.assertEqual(ec.get_cuda_cc_template_value(key), expected) def test_count_files(self): """Tests for EasyConfig.count_files method."""