From 40aa6f1714db08f75a44f6fcfd023ef91fb81a5a Mon Sep 17 00:00:00 2001 From: insolor Date: Wed, 23 Aug 2023 23:07:56 +0300 Subject: [PATCH 1/3] Add ruff --- poetry.lock | 28 +++++++++++++++++++++++++++- pyproject.toml | 8 ++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 037906c..fd7c6a6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -375,6 +375,32 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "ruff" +version = "0.0.285" +description = "An extremely fast Python linter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.0.285-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:72a3a0936369b986b0e959f9090206ed3c18f9e5e439ea5b8e6867c6707aded5"}, + {file = "ruff-0.0.285-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0d9ab6ad16742eb78919e0fba09f914f042409df40ad63423c34bb20d350162a"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c48926156288b8ac005eb1db5e77c15e8a37309ae49d9fb6771d5cf5f777590"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d2a60c102e7a5e147b58fc2cbea12a563c565383effc527c987ea2086a05742"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b02aae62f922d088bb01943e1dbd861688ada13d735b78b8348a7d90121fd292"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f572c4296d8c7ddd22c3204de4031965be524fdd1fdaaef273945932912b28c5"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80effdf4fe69763d69eb4ab9443e186fd09e668b59fe70ba4b49f4c077d15a1b"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5977ce304da35c263f5e082901bd7ac0bd2be845a8fcfd1a29e4d6680cddb307"}, + {file = "ruff-0.0.285-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a087712d474fa17b915d7cb9ef807e1256182b12ddfafb105eb00aeee48d1a"}, + {file = "ruff-0.0.285-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7ce67736cd8dfe97162d1e7adfc2d9a1bac0efb9aaaff32e4042c7cde079f54b"}, + {file = "ruff-0.0.285-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5473a4c6cac34f583bff08c5f63b8def5599a0ea4dc96c0302fbd2cc0b3ecbad"}, + {file = "ruff-0.0.285-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e6b1c961d608d373a032f047a20bf3c55ad05f56c32e7b96dcca0830a2a72348"}, + {file = "ruff-0.0.285-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2933cc9631f453305399c7b8fb72b113ad76b49ae1d7103cc4afd3a423bed164"}, + {file = "ruff-0.0.285-py3-none-win32.whl", hash = "sha256:770c5eb6376de024111443022cda534fb28980a9dd3b4abc83992a8770167ba6"}, + {file = "ruff-0.0.285-py3-none-win_amd64.whl", hash = "sha256:a8c6ad6b9cd77489bf6d1510950cbbe47a843aa234adff0960bae64bd06c3b6d"}, + {file = "ruff-0.0.285-py3-none-win_arm64.whl", hash = "sha256:de44fbc6c3b25fccee473ddf851416fd4e246fc6027b2197c395b1b3b3897921"}, + {file = "ruff-0.0.285.tar.gz", hash = "sha256:45866048d1dcdcc80855998cb26c4b2b05881f9e043d2e3bfe1aa36d9a2e8f28"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -400,4 +426,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "0bf9c6b7eed0f65ce644f8377f9046caf783ca687fb5905f935906b6e6aa14ef" +content-hash = "946cd6cc313310b6ff6e36ba081a51f59af74e6968e00f284a6a89c007496564" diff --git a/pyproject.toml b/pyproject.toml index 2f911f6..6d44b81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ pytest = "^7.4.0" pytest-cov = "^4.1.0" black = "^23.3.0" isort = "^5.12.0" +ruff = "^0.0.285" [build-system] requires = ["poetry-core>=1.0.0"] @@ -25,3 +26,10 @@ line-length = 120 [tool.isort] profile = "black" + +[tool.ruff] +line-length = 120 +select = ["E", "F", "UP"] +ignore = ["UP015"] +unfixable = ["F401"] +target-version = "py38" From 4e2c11d85575e1cb0d9f9c8ea7d9a206e8d691fe Mon Sep 17 00:00:00 2001 From: insolor Date: Wed, 23 Aug 2023 23:11:39 +0300 Subject: [PATCH 2/3] Apply ruff --fix --- changetext/changetext.py | 2 +- changetext/common_state.py | 2 +- changetext/corrector.py | 10 ++++--- changetext/final_changes.py | 46 +++++++++++++++---------------- changetext/logging_tools.py | 4 +-- changetext/preliminary_changes.py | 4 +-- changetext/tag_correction.py | 2 +- changetext/utils.py | 6 ++-- tests/test_logging.py | 4 +-- 9 files changed, 41 insertions(+), 39 deletions(-) diff --git a/changetext/changetext.py b/changetext/changetext.py index bf9d370..51f209d 100644 --- a/changetext/changetext.py +++ b/changetext/changetext.py @@ -19,5 +19,5 @@ def change_text(text): @log_exceptions() def outer_change_text(text): result = change_text(text) - get_logger().write("{}({!r}) -> {!r}".format(outer_change_text.__name__, text, result)) + get_logger().write(f"{outer_change_text.__name__}({text!r}) -> {result!r}") return result diff --git a/changetext/common_state.py b/changetext/common_state.py index 503bc25..9310399 100644 --- a/changetext/common_state.py +++ b/changetext/common_state.py @@ -16,6 +16,6 @@ def init(): pass -@functools.lru_cache() +@functools.lru_cache def get_state(object_id=None): return ChangeTextState(object_id) diff --git a/changetext/corrector.py b/changetext/corrector.py index 7e4ecf4..12bcd5f 100644 --- a/changetext/corrector.py +++ b/changetext/corrector.py @@ -16,10 +16,12 @@ def decorator(func): if isinstance(regex, str): regex = re.compile(regex) - predicate = lambda text: regex.search(text) + def predicate(text): + return regex.search(text) if predicate is None: - predicate = lambda _text: True + def predicate(_text): + return True self.changes.append((predicate, func)) @@ -40,7 +42,7 @@ def incremental_changes(self, text): if predicate_result: result = func(text, predicate_result) if result: - get_logger().write("{}({!r}) -> {!r}".format(func.__name__, text, result)) + get_logger().write(f"{func.__name__}({text!r}) -> {result!r}") text = result or text return text @@ -51,7 +53,7 @@ def exclusive_changes(self, text): if predicate_result: result = func(text, predicate_result) if result: - get_logger().write("{}({!r}) -> {!r}".format(func.__name__, text, result)) + get_logger().write(f"{func.__name__}({text!r}) -> {result!r}") return result or text return text diff --git a/changetext/final_changes.py b/changetext/final_changes.py index f025339..1c0d268 100644 --- a/changetext/final_changes.py +++ b/changetext/final_changes.py @@ -46,7 +46,7 @@ @final_changes.register(regex=r"Histories of (\w+) and (\w+)") def corr_histories_of(_, search_result): - return "Истории о{} и {}".format(histories_adjs[search_result.group(1)], histories_adjs[search_result.group(2)]) + return f"Истории о{histories_adjs[search_result.group(1)]} и {histories_adjs[search_result.group(2)]}" possessive_adjectives = {"жаба": "жабий", "корова": "коровий", "медведь": "медвежий"} @@ -117,7 +117,7 @@ def corr_container(text, _): adjective = None gender = get_gender(container, {"nomn"}) adjective = inflect_adjective(adjective, gender) - replacement_string = "{} {} ({})".format(container, containment, adjective) + replacement_string = f"{container} {containment} ({adjective})" else: words = of_material.split() material = None @@ -144,7 +144,7 @@ def corr_container(text, _): material = "из " + " ".join(gen_case) else: material = of_material - replacement_string = "{} {} ({}".format(container, containment, material) + replacement_string = f"{container} {containment} ({material}" if initial_string[-1] == ")": replacement_string += ")" text = text.replace(initial_string, replacement_string.capitalize()) @@ -245,7 +245,7 @@ def corr_of_material_item(text, _): else: replacement_string = " ".join(words) + " " + of_material else: - raise ValueError("Unknown case: {!r}".format(text)) + raise ValueError(f"Unknown case: {text!r}") text = text.replace(initial_string, replacement_string) return text @@ -282,7 +282,7 @@ def corr_clothes(text, _): search_result = re_clothes.search(text) text = text.replace( search_result.group(1), - "{} {} {}".format(search_result.group(4), search_result.group(3), to_genitive_case(search_result.group(2))), + f"{search_result.group(4)} {search_result.group(3)} {to_genitive_case(search_result.group(2))}", ) text = text.replace("левый", "левая") text = text.replace("правый", "правая") @@ -307,7 +307,7 @@ def corr_prepared(text, search_result): # >>> corr_prepared(" рубленная гигантский крот лёгкие") # ' рубленные лёгкие гигантского крота' groups = search_result.groups() - result = text.replace(groups[0], "{} {} {}".format(groups[1], groups[3], to_genitive_case(groups[2]))) + result = text.replace(groups[0], f"{groups[1]} {groups[3]} {to_genitive_case(groups[2])}") return result @@ -414,14 +414,14 @@ def corr_weapon_trap_parts(text, search_result): gender = get_main_word_gender(obj) new_adj = inflect_as_adjective(adj, gender) new_word_2 = inflect_adjective(make_adjective[material], gender) - text = text.replace(search_result.group(0), "{} {} {}".format(new_adj, new_word_2, obj)) + text = text.replace(search_result.group(0), f"{new_adj} {new_word_2} {obj}") else: material = " ".join(words[:3]) obj = " ".join(words[3:]) gender = get_main_word_gender(obj) assert gender is not None new_adj = inflect_as_adjective(adj, gender) - text = text.replace(search_result.group(0), "{} {} {}".format(new_adj, obj, material)) + text = text.replace(search_result.group(0), f"{new_adj} {obj} {material}") return text @@ -632,7 +632,7 @@ def corr_stopped_construction(_, search_result): else: gen_case_obj = to_genitive_case(obj) - return ("{} приостановили строительство {}.".format(subj, gen_case_obj)).capitalize() + return f"{subj} приостановили строительство {gen_case_obj}.".capitalize() @final_changes.register( @@ -655,7 +655,7 @@ def corr_relief(_, search_result): if group1.split(" ")[0] == "Мёртвый": text = "Мёртвое деревце ({})".format("".join(search_result.group(0).split(" ")[1:-1])) else: - text = "Деревце ({})".format(group1) + text = f"Деревце ({group1})" return text.capitalize() if " " in group1: @@ -688,7 +688,7 @@ def corr_relief(_, search_result): text = "{} {} из {}".format(" ".join(first_words), obj, " ".join(words)) else: material = group1 - text = "{} из {}".format(obj, to_genitive_case(material)) + text = f"{obj} из {to_genitive_case(material)}" if "иза" in text: text = text.replace(" иза", "") @@ -722,7 +722,7 @@ def corr_adjective_relief(text, search_result): gender = get_gender(obj) new_word = inflect_adjective(adjective, gender, "nomn") if new_word: - text = "{} {}".format(new_word, obj) + text = f"{new_word} {obj}" return text.capitalize() @@ -787,7 +787,7 @@ def corr_settlement(_, search_result): name = search_result.group(3) if len(adjective) == 0: - return "{} {}".format(settlement.capitalize(), name.capitalize()) + return f"{settlement.capitalize()} {name.capitalize()}" if adjective in {"Покинуть", "Разрушить"}: return @@ -802,7 +802,7 @@ def corr_settlement(_, search_result): if adjective_2 is None: adjective_2 = adjective - return "{} {} {}".format(adjective_2.capitalize(), settlement, name.capitalize()) + return f"{adjective_2.capitalize()} {settlement} {name.capitalize()}" # Clothier's shop @@ -845,7 +845,7 @@ def corr_clothiers_shop(_, search_result): preposition = "на" material = inflect_noun(material, case="loct", orig_form={"nomn"}) - return "{} {} {} {}".format(verb, product, preposition, material) + return f"{verb} {product} {preposition} {material}" else: if product in {"щит", "баклер"}: _, of_material = cloth_subst[material] # Don't change the verb, leave 'Делать'/'Изготовить' @@ -860,9 +860,9 @@ def corr_clothiers_shop(_, search_result): if material in make_adjective: # "шёлк" -> "шёлковый" gender = get_gender(product, {"nomn"}) material_adj = inflect_adjective(make_adjective[material], gender, "accs", animated=False) - return "{} {} {}".format(verb, material_adj, product_accus) # {Шить} {шёлковую} {робу} + return f"{verb} {material_adj} {product_accus}" # {Шить} {шёлковую} {робу} else: - return "{} {} {}".format(verb, product_accus, of_material) # {Шить} {робу} {из ткани} + return f"{verb} {product_accus} {of_material}" # {Шить} {робу} {из ткани} @final_changes.register(regex=r"(Делать|Изготовить|Украшать)([\w\s/]+)$") @@ -903,7 +903,7 @@ def corr_craft_general(text, search_result): if len(words) == 1 and words[0] not in make_adjective and not is_adjective(words[0]): material = inflect_noun(words[0], "gent", orig_form={"nomn", "inan"}) # рог -> (из) рога assert material is not None - result = "{} {} из {}".format(verb, product, material) + result = f"{verb} {product} из {material}" else: adjectives = [ make_adjective[word] if word in make_adjective else word if is_adjective(word) else None @@ -913,7 +913,7 @@ def corr_craft_general(text, search_result): adjectives = [inflect_adjective(adj, product_gender, "accs", animated=False) for adj in adjectives] result = "{} {} {}".format(verb, " ".join(adjectives), product) else: - result = "{} {}".format(verb, product) + result = f"{verb} {product}" return text.replace(search_result.group(0), result).capitalize() @@ -962,7 +962,7 @@ def corr_animal_material(_, search_result): def corr_rings(text, search_result): obj = search_result.group(2) description = search_result.group(1) - return text.replace(search_result.group(0), "{} из {}".format(obj, to_genitive_case(description))) + return text.replace(search_result.group(0), f"{obj} из {to_genitive_case(description)}") @final_changes.register(predicate=lambda text: text.startswith("Вы нашли из ")) @@ -983,7 +983,7 @@ def corr_you_struck(text, _): else: result = inflect_collocation(material, {"accs"}) - return "{} {}!".format(you_struck, result) + return f"{you_struck} {result}!" @final_changes.register(regex=r"(.+)\s(стал)\s(.+)\.") @@ -1005,6 +1005,6 @@ def corr_become(_, search_result): words = search_result.group(3) words = inflect_collocation(words, {"ablt"}) if subj.startswith("Животное"): - return "Животное выросло и стало {}.".format(words) + return f"Животное выросло и стало {words}." else: - return "{} {} {}.".format(subj, verb, words) + return f"{subj} {verb} {words}." diff --git a/changetext/logging_tools.py b/changetext/logging_tools.py index 6be4ddc..0ec9be8 100644 --- a/changetext/logging_tools.py +++ b/changetext/logging_tools.py @@ -24,7 +24,7 @@ def write(self, text): self.logged.add(text) -@functools.lru_cache() +@functools.lru_cache def get_logger(stream=None): return LoggerWrapper(stream) @@ -36,7 +36,7 @@ def wrapper(text): try: return func(text) except Exception: - get_logger(stream).logger.exception("An exception occurred. Initial string: {!r}".format(text)) + get_logger(stream).logger.exception(f"An exception occurred. Initial string: {text!r}") return wrapper diff --git a/changetext/preliminary_changes.py b/changetext/preliminary_changes.py index cab576f..747d945 100644 --- a/changetext/preliminary_changes.py +++ b/changetext/preliminary_changes.py @@ -91,7 +91,7 @@ def corr_ending_s(text): number = int(number) parse = [x for x in custom_parse(group2) if {"NOUN", "nomn", "sing"} in x.tag] assert len(parse) == 1 - replacement_string = "{:d} {}".format(number, parse[0].make_agree_with_number(number).word) + replacement_string = f"{number:d} {parse[0].make_agree_with_number(number).word}" elif group2 in dict_ending_s: replacement_string = dict_ending_s[group2] elif " " not in group2: @@ -320,7 +320,7 @@ def corr_tags_outer(text, _): try: result = corr_tags(text) except (AssertionError, ValueError) as err: - print("corr_tags() raises exception {!r}:".format(err)) + print(f"corr_tags() raises exception {err!r}:") print(traceback.format_exc()) result = " ".join( part.strip(" ") if not part.startswith("<") else part.strip("<>").partition(":")[2] diff --git a/changetext/tag_correction.py b/changetext/tag_correction.py index 421f02b..5a9d267 100644 --- a/changetext/tag_correction.py +++ b/changetext/tag_correction.py @@ -54,7 +54,7 @@ def corr_tags(text, state=None): if "get-form" in tags: if get_index is not None: - raise ValueError("Duplicate tag in {!r}".format(text)) + raise ValueError(f"Duplicate tag in {text!r}") get_index = len(text_parts) tags.remove("get-form") elif "set-form" in tags: diff --git a/changetext/utils.py b/changetext/utils.py index fe1b190..d47e1a5 100644 --- a/changetext/utils.py +++ b/changetext/utils.py @@ -65,7 +65,7 @@ def inflect_collocation(text: str, tags: Set[str]) -> str: for i, word in enumerate(words[:j]): parse = custom_parse(word) if not is_adjective(word, parse): - raise ValueError("{} is not an adjective".format(word)) + raise ValueError(f"{word} is not an adjective") p = next(p for p in parse if {"ADJF"} in p.tag) p1 = p.inflect(tags) assert p1 is not None, (p, tags) @@ -433,7 +433,7 @@ def get_main_word_gender(text: str) -> Optional[str]: def parse_as_adjective(adjective: str) -> List[Parse]: parse = [p for p in custom_parse(adjective) if "ADJF" in p.tag or "PRTF" in p.tag] - assert len(parse) > 0, "parse: {!r}".format(parse) + assert len(parse) > 0, f"parse: {parse!r}" return parse @@ -516,7 +516,7 @@ def inflect_as_adjective(adj: str, gender: str) -> str: elif is_adjective(adj): new_adj = inflect_adjective(adj, gender) else: - raise ValueError("Cannot inflect {} as adjective".format(adj)) + raise ValueError(f"Cannot inflect {adj} as adjective") return new_adj diff --git a/tests/test_logging.py b/tests/test_logging.py index d01be4f..b2374a3 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -13,7 +13,7 @@ def test_double_write(): result = "result" file = io.StringIO() - text = "{!r} --> {!r}".format(text, result) + text = f"{text!r} --> {result!r}" get_logger(file).write(text) assert file.getvalue().strip() == text @@ -33,4 +33,4 @@ def foo(_): foo("text") stderr_text = file.getvalue().splitlines(keepends=False) - assert stderr_text[0] == "An exception occurred. Initial string: {!r}".format(arg) + assert stderr_text[0] == f"An exception occurred. Initial string: {arg!r}" From 6bb464727329478d28fd083e225a41948aec527b Mon Sep 17 00:00:00 2001 From: insolor Date: Thu, 24 Aug 2023 19:41:14 +0300 Subject: [PATCH 3/3] Fix refurb warnings --- changetext/corrector.py | 2 +- changetext/final_changes.py | 4 ++-- changetext/preliminary_changes.py | 4 ++-- changetext/utf16_codec.py | 4 ++-- changetext/utils.py | 20 ++++++++++---------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/changetext/corrector.py b/changetext/corrector.py index 12bcd5f..602219c 100644 --- a/changetext/corrector.py +++ b/changetext/corrector.py @@ -6,7 +6,7 @@ class CorrectorRegistry: def __init__(self): - self.changes = list() + self.changes = [] def register(self, regex=None, predicate=None): def decorator(func): diff --git a/changetext/final_changes.py b/changetext/final_changes.py index 1c0d268..9d67cea 100644 --- a/changetext/final_changes.py +++ b/changetext/final_changes.py @@ -1006,5 +1006,5 @@ def corr_become(_, search_result): words = inflect_collocation(words, {"ablt"}) if subj.startswith("Животное"): return f"Животное выросло и стало {words}." - else: - return f"{subj} {verb} {words}." + + return f"{subj} {verb} {words}." diff --git a/changetext/preliminary_changes.py b/changetext/preliminary_changes.py index 747d945..e581882 100644 --- a/changetext/preliminary_changes.py +++ b/changetext/preliminary_changes.py @@ -236,8 +236,8 @@ def corr_animal_gender(text, search_result): animal = search_result.group(1) if animal not in animal_genders: return None - else: - return text.replace(search_result.group(0), animal_genders[animal][gender] + ", " + search_result.group(2)) + + return text.replace(search_result.group(0), animal_genders[animal][gender] + ", " + search_result.group(2)) @preliminary_changes.register(regex=re.compile(r"(он|она|вы)\s+(не\s+)?(имеете?)", flags=re.IGNORECASE)) diff --git a/changetext/utf16_codec.py b/changetext/utf16_codec.py index 4e96857..88fdf23 100644 --- a/changetext/utf16_codec.py +++ b/changetext/utf16_codec.py @@ -8,7 +8,7 @@ def wrapper(data): data = data.decode("utf-16-le") output = func(data) return output if output is None else output.encode("utf-16-le") + b"\0\0" - else: - return func(data) + + return func(data) return wrapper diff --git a/changetext/utils.py b/changetext/utils.py index d47e1a5..396d192 100644 --- a/changetext/utils.py +++ b/changetext/utils.py @@ -12,12 +12,12 @@ def custom_parse(word: str) -> List[Parse]: if word.lower().startswith("адамантин"): return morph.parse(word) # Pymorphy2 thinks that adamantine is a surname and treats it properly - else: - return [p for p in morph.parse(word) if all(tag not in p.tag for tag in unwanted_tags)] + + return [p for p in morph.parse(word) if all(tag not in p.tag for tag in unwanted_tags)] def tag_to_set(tag: OpencorporaTag) -> Set[str]: - return set(sum((ss.split() for ss in str(tag).split(",")), list())) + return set(sum((ss.split() for ss in str(tag).split(",")), [])) def common_tags(parse: List[Parse]) -> Set[str]: @@ -90,8 +90,8 @@ def split_sentence(text: str) -> Optional[Tuple[str, str]]: sentence = re_sentence.search(text) if sentence: return cast(Tuple[str, str], sentence.groups()) - else: - return text, "" + + return text, "" def is_enumeration_delimiter(text: str) -> bool: @@ -410,7 +410,7 @@ def get_gender(obj: str, known_tags: Union[None, str, Set[str]] = None) -> Optio if obj.lower() in gender_exceptions: return gender_exceptions[obj.lower()] else: - if len(parse) > 0: + if parse: gender = pm_gender(parse[0]) for p in parse: if pm_gender(p) != gender: @@ -433,7 +433,7 @@ def get_main_word_gender(text: str) -> Optional[str]: def parse_as_adjective(adjective: str) -> List[Parse]: parse = [p for p in custom_parse(adjective) if "ADJF" in p.tag or "PRTF" in p.tag] - assert len(parse) > 0, f"parse: {parse!r}" + assert parse, f"parse: {parse!r}" return parse @@ -466,7 +466,7 @@ def inflect_noun(word: str, case: str, orig_form: Union[None, str, Set[str]] = N if orig_form: parse = [p for p in parse if orig_form in p.tag] - assert len(parse) > 0 + assert parse p = parse[0] new_form = p.inflect({case, p.tag.number}) @@ -477,8 +477,8 @@ def inflect_noun(word: str, case: str, orig_form: Union[None, str, Set[str]] = N def to_genitive_case_single_noun(word: str) -> str: if word.lower() in gent_case_except: return gent_case_except[word.lower()] - else: - return inflect_noun(word, case="gent") + + return inflect_noun(word, case="gent") def to_genitive_case_list(words: List[str]) -> Iterator[str]: