diff --git a/isort/main.py b/isort/main.py index f6749e69..b1a29891 100644 --- a/isort/main.py +++ b/isort/main.py @@ -433,6 +433,15 @@ def _build_arg_parser() -> argparse.ArgumentParser: action="store_true", help="Combines as imports on the same line.", ) + output_group.add_argument( + "--fsai", + "--force-separate-as-imports", + dest="force_separate_as_imports", + action="store_true", + help="Forces as imports to be emitted after the plain imports of the same " + "module, keeping the plain imports grouped in a single statement. " + "Has no effect when combine-as is enabled.", + ) output_group.add_argument( "--cs", "--combine-star", diff --git a/isort/output.py b/isort/output.py index cc4fb2b2..708cc23b 100644 --- a/isort/output.py +++ b/isort/output.py @@ -337,6 +337,13 @@ def _with_from_imports( for from_import, sub_module in zip(from_imports, sub_modules, strict=False) if sub_module in parsed.as_map["from"] } + # when force_separate_as_imports (and not combine_as_imports), move aliased + # imports to the end so that non-aliased imports stay grouped together in a + # single block + if config.force_separate_as_imports and not config.combine_as_imports and as_imports: + non_aliased = [imp for imp in from_imports if imp not in as_imports] + aliased = [imp for imp in from_imports if imp in as_imports] + from_imports = non_aliased + aliased if config.combine_as_imports and not ("*" in from_imports and config.combine_star): if not config.no_inline_sort: for as_import in as_imports: diff --git a/isort/settings.py b/isort/settings.py index 02ebfe20..f247d914 100644 --- a/isort/settings.py +++ b/isort/settings.py @@ -173,6 +173,7 @@ class _Config: lines_between_sections: int = 1 lines_between_types: int = 0 combine_as_imports: bool = False + force_separate_as_imports: bool = False combine_star: bool = False include_trailing_comma: bool = False from_first: bool = False