From 86b0ca1fa68dc9974828dbda911d47b809b89f20 Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Sun, 4 Apr 2021 18:28:47 +0530 Subject: [PATCH 1/2] fix(mypy): type annotations for conversions algorithms --- conversions/binary_to_octal.py | 2 +- conversions/decimal_to_binary.py | 6 +++--- conversions/decimal_to_hexadecimal.py | 3 ++- conversions/decimal_to_octal.py | 4 ++-- conversions/prefix_conversions.py | 14 ++++++++------ conversions/weight_conversion.py | 4 ++-- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/conversions/binary_to_octal.py b/conversions/binary_to_octal.py index 8b594887867e..35ede95b134d 100644 --- a/conversions/binary_to_octal.py +++ b/conversions/binary_to_octal.py @@ -28,7 +28,7 @@ def bin_to_octal(bin_string: str) -> str: bin_string = "0" + bin_string bin_string_in_3_list = [ bin_string[index : index + 3] - for index, value in enumerate(bin_string) + for index in range(len(bin_string)) if index % 3 == 0 ] for bin_group in bin_string_in_3_list: diff --git a/conversions/decimal_to_binary.py b/conversions/decimal_to_binary.py index 7e83aee4f7a5..c21cdbcaec68 100644 --- a/conversions/decimal_to_binary.py +++ b/conversions/decimal_to_binary.py @@ -28,9 +28,9 @@ def decimal_to_binary(num: int) -> str: TypeError: 'str' object cannot be interpreted as an integer """ - if type(num) == float: + if isinstance(num, float): raise TypeError("'float' object cannot be interpreted as an integer") - if type(num) == str: + if isinstance(num, str): raise TypeError("'str' object cannot be interpreted as an integer") if num == 0: @@ -42,7 +42,7 @@ def decimal_to_binary(num: int) -> str: negative = True num = -num - binary = [] + binary: list[int] = [] while num > 0: binary.insert(0, num % 2) num >>= 1 diff --git a/conversions/decimal_to_hexadecimal.py b/conversions/decimal_to_hexadecimal.py index 433f78dfecb7..2389c6d1f2a1 100644 --- a/conversions/decimal_to_hexadecimal.py +++ b/conversions/decimal_to_hexadecimal.py @@ -21,7 +21,7 @@ } -def decimal_to_hexadecimal(decimal): +def decimal_to_hexadecimal(decimal: float) -> str: """ take integer decimal value, return hexadecimal representation as str beginning with 0x @@ -58,6 +58,7 @@ def decimal_to_hexadecimal(decimal): True """ assert type(decimal) in (int, float) and decimal == int(decimal) + decimal = int(decimal) hexadecimal = "" negative = False if decimal < 0: diff --git a/conversions/decimal_to_octal.py b/conversions/decimal_to_octal.py index 8dc04830ad87..4c313bddf64c 100644 --- a/conversions/decimal_to_octal.py +++ b/conversions/decimal_to_octal.py @@ -17,14 +17,14 @@ def decimal_to_octal(num: int) -> str: counter = 0 while num > 0: remainder = num % 8 - octal = octal + (remainder * math.pow(10, counter)) + octal = octal + (remainder * math.floor(math.pow(10, counter))) counter += 1 num = math.floor(num / 8) # basically /= 8 without remainder if any # This formatting removes trailing '.0' from `octal`. return f"0o{int(octal)}" -def main(): +def main() -> None: """Print octal equivalents of decimal numbers.""" print("\n2 in octal is:") print(decimal_to_octal(2)) # = 2 diff --git a/conversions/prefix_conversions.py b/conversions/prefix_conversions.py index c2440d1cf886..78db4a91709c 100644 --- a/conversions/prefix_conversions.py +++ b/conversions/prefix_conversions.py @@ -59,10 +59,12 @@ def convert_si_prefix( 1000 """ if isinstance(known_prefix, str): - known_prefix: SI_Unit = SI_Unit[known_prefix.lower()] + known_prefix = SI_Unit[known_prefix.lower()] if isinstance(unknown_prefix, str): - unknown_prefix: SI_Unit = SI_Unit[unknown_prefix.lower()] - unknown_amount = known_amount * (10 ** (known_prefix.value - unknown_prefix.value)) + unknown_prefix = SI_Unit[unknown_prefix.lower()] + unknown_amount: float = known_amount * ( + 10 ** (known_prefix.value - unknown_prefix.value) + ) return unknown_amount @@ -85,10 +87,10 @@ def convert_binary_prefix( 1024 """ if isinstance(known_prefix, str): - known_prefix: Binary_Unit = Binary_Unit[known_prefix.lower()] + known_prefix = Binary_Unit[known_prefix.lower()] if isinstance(unknown_prefix, str): - unknown_prefix: Binary_Unit = Binary_Unit[unknown_prefix.lower()] - unknown_amount = known_amount * ( + unknown_prefix = Binary_Unit[unknown_prefix.lower()] + unknown_amount: float = known_amount * ( 2 ** ((known_prefix.value - unknown_prefix.value) * 10) ) return unknown_amount diff --git a/conversions/weight_conversion.py b/conversions/weight_conversion.py index 85515f2f6f88..c344416be5f5 100644 --- a/conversions/weight_conversion.py +++ b/conversions/weight_conversion.py @@ -29,7 +29,7 @@ -> Wikipedia reference: https://en.wikipedia.org/wiki/Dalton_(unit) """ -KILOGRAM_CHART = { +KILOGRAM_CHART: dict[str, float] = { "kilogram": 1, "gram": pow(10, 3), "milligram": pow(10, 6), @@ -42,7 +42,7 @@ "atomic-mass-unit": 6.022136652e26, } -WEIGHT_TYPE_CHART = { +WEIGHT_TYPE_CHART: dict[str, float] = { "kilogram": 1, "gram": pow(10, -3), "milligram": pow(10, -6), From 4d34f97758f8a3a9e6255cab70822af477dcd0fa Mon Sep 17 00:00:00 2001 From: Dhruv Manilawala Date: Sun, 4 Apr 2021 18:29:55 +0530 Subject: [PATCH 2/2] refactor(CI): include conversions algorithms for mypy tests --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac5f80206e35..eb54d85ea035 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: python -m pip install mypy pytest-cov -r requirements.txt # FIXME: #4052 fix mypy errors in the exclude directories and remove them below - run: mypy --ignore-missing-imports - --exclude '(conversions|data_structures|digital_image_processing|dynamic_programming|graphs|linear_algebra|maths|matrix|other|project_euler|scripts|searches|strings*)/$' . + --exclude '(data_structures|digital_image_processing|dynamic_programming|graphs|linear_algebra|maths|matrix|other|project_euler|scripts|searches|strings*)/$' . - name: Run tests run: pytest --doctest-modules --ignore=project_euler/ --ignore=scripts/ --cov-report=term-missing:skip-covered --cov=. . - if: ${{ success() }}