Skip to content

Commit a36b8a5

Browse files
committed
Always use a def instead of assigning a lambda
This stops listing Ruff rule `E731` ("Do not assign a `lambda` expression, use a `def`") as ignored, and fixes all occurrences of it: - Spacing is manually adjusted so that readability is not harmed, while still satisfying the current formatting conventions. - Although the affected test modules do not currently use type annotations, the non-test modules do. Some of the lambdas already had type annotations, by annotating the variable itself with an expression formed by subscripting `Callable`. This change preserves them, converting them to paramter and return type annotations in the resulting `def`. Where such type annotations were absent (in lambdas in non-test modules), or partly absent, all missing annotations are added to the `def`. - Unused paramters are prefixed with a `_`. - `IndexFile.checkout` assigned a lambda to `make_exc`, whose body was somewhat difficult to read. Separately from converting it to a `def`, this refactors the expression in the `return` statement to use code like `(x, *ys)` in place of `(x,) + tuple(ys)`. This change does not appear to have introduced (nor fixed) any `mypy` errors. This only affects lambdas that were assigned directly to variables. Other lambda expressions remain unchanged.
1 parent 6f4f7f5 commit a36b8a5

File tree

6 files changed

+36
-10
lines changed

6 files changed

+36
-10
lines changed

git/index/base.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,10 @@ def unmerged_blobs(self) -> Dict[PathLike, List[Tuple[StageType, Blob]]]:
530530
stage. That is, a file removed on the 'other' branch whose entries are at
531531
stage 3 will not have a stage 3 entry.
532532
"""
533-
is_unmerged_blob = lambda t: t[0] != 0
533+
534+
def is_unmerged_blob(t: Tuple[StageType, Blob]) -> bool:
535+
return t[0] != 0
536+
534537
path_map: Dict[PathLike, List[Tuple[StageType, Blob]]] = {}
535538
for stage, blob in self.iter_blobs(is_unmerged_blob):
536539
path_map.setdefault(blob.path, []).append((stage, blob))
@@ -690,12 +693,17 @@ def _store_path(self, filepath: PathLike, fprogress: Callable) -> BaseIndexEntry
690693
This must be ensured in the calling code.
691694
"""
692695
st = os.lstat(filepath) # Handles non-symlinks as well.
696+
693697
if S_ISLNK(st.st_mode):
694698
# In PY3, readlink is a string, but we need bytes.
695699
# In PY2, it was just OS encoded bytes, we assumed UTF-8.
696-
open_stream: Callable[[], BinaryIO] = lambda: BytesIO(force_bytes(os.readlink(filepath), encoding=defenc))
700+
def open_stream() -> BinaryIO:
701+
return BytesIO(force_bytes(os.readlink(filepath), encoding=defenc))
697702
else:
698-
open_stream = lambda: open(filepath, "rb")
703+
704+
def open_stream() -> BinaryIO:
705+
return open(filepath, "rb")
706+
699707
with open_stream() as stream:
700708
fprogress(filepath, False, filepath)
701709
istream = self.repo.odb.store(IStream(Blob.type, st.st_size, stream))
@@ -1336,8 +1344,11 @@ def handle_stderr(proc: "Popen[bytes]", iter_checked_out_files: Iterable[PathLik
13361344
kwargs["as_process"] = True
13371345
kwargs["istream"] = subprocess.PIPE
13381346
proc = self.repo.git.checkout_index(args, **kwargs)
1347+
13391348
# FIXME: Reading from GIL!
1340-
make_exc = lambda: GitCommandError(("git-checkout-index",) + tuple(args), 128, proc.stderr.read())
1349+
def make_exc() -> GitCommandError:
1350+
return GitCommandError(("git-checkout-index", *args), 128, proc.stderr.read())
1351+
13411352
checked_out_files: List[PathLike] = []
13421353

13431354
for path in paths:

git/objects/tree.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050

5151
# --------------------------------------------------------
5252

53-
cmp: Callable[[str, str], int] = lambda a, b: (a > b) - (a < b)
53+
54+
def cmp(a: str, b: str) -> int:
55+
return (a > b) - (a < b)
5456

5557

5658
class TreeModifier:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ lint.extend-select = [
6666
"TC004", # See: https://docs.astral.sh/ruff/rules/runtime-import-in-type-checking-block/
6767
]
6868
lint.ignore = [
69-
"E731", # Do not assign a `lambda` expression, use a `def`
69+
# If it becomes necessary to ignore any rules, list them here.
7070
]
7171
lint.unfixable = [
7272
"F401", # Module imported but unused

test/test_fun.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ def test_tree_traversal(self):
243243
B_old = self.rorepo.tree("1f66cfbbce58b4b552b041707a12d437cc5f400a") # old base tree
244244

245245
# Two very different trees.
246+
246247
entries = traverse_trees_recursive(odb, [B_old.binsha, H.binsha], "")
247248
self._assert_tree_entries(entries, 2)
248249

@@ -251,7 +252,10 @@ def test_tree_traversal(self):
251252
self._assert_tree_entries(oentries, 2)
252253

253254
# Single tree.
254-
is_no_tree = lambda i, d: i.type != "tree"
255+
256+
def is_no_tree(i, _d):
257+
return i.type != "tree"
258+
255259
entries = traverse_trees_recursive(odb, [B.binsha], "")
256260
assert len(entries) == len(list(B.traverse(predicate=is_no_tree)))
257261
self._assert_tree_entries(entries, 1)

test/test_index.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,10 @@ def test_index_file_from_tree(self, rw_repo):
330330
assert len([e for e in three_way_index.entries.values() if e.stage != 0])
331331

332332
# ITERATE BLOBS
333-
merge_required = lambda t: t[0] != 0
333+
334+
def merge_required(t):
335+
return t[0] != 0
336+
334337
merge_blobs = list(three_way_index.iter_blobs(merge_required))
335338
assert merge_blobs
336339
assert merge_blobs[0][0] in (1, 2, 3)

test/test_tree.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,18 @@ def test_traverse(self):
126126
assert len(list(root)) == len(list(root.traverse(depth=1)))
127127

128128
# Only choose trees.
129-
trees_only = lambda i, d: i.type == "tree"
129+
130+
def trees_only(i, _d):
131+
return i.type == "tree"
132+
130133
trees = list(root.traverse(predicate=trees_only))
131134
assert len(trees) == len([i for i in root.traverse() if trees_only(i, 0)])
132135

133136
# Test prune.
134-
lib_folder = lambda t, d: t.path == "lib"
137+
138+
def lib_folder(t, _d):
139+
return t.path == "lib"
140+
135141
pruned_trees = list(root.traverse(predicate=trees_only, prune=lib_folder))
136142
assert len(pruned_trees) < len(trees)
137143

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy