From c47cbc1ae8261bf71ddb752ef2fbe404764a5584 Mon Sep 17 00:00:00 2001 From: Sungyoon Jeong Date: Thu, 22 Jan 2026 16:23:09 +0900 Subject: [PATCH 1/2] Move aliased imports to the end to group non-aliased together --- isort/output.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/isort/output.py b/isort/output.py index cc4fb2b2..ec1e6927 100644 --- a/isort/output.py +++ b/isort/output.py @@ -337,6 +337,12 @@ 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 not combine_as_imports, move aliased imports to the end so that + # non-aliased imports stay grouped together in a single block + if 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: From 34a5067f44c71f70c392c11925caa2df8e621fbb Mon Sep 17 00:00:00 2001 From: Sungyoon Jeong Date: Sun, 26 Jul 2026 00:01:21 +0900 Subject: [PATCH 2/2] Add --force-separate-as-imports flag --- isort/main.py | 9 +++++++++ isort/output.py | 7 ++++--- isort/settings.py | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) 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 ec1e6927..708cc23b 100644 --- a/isort/output.py +++ b/isort/output.py @@ -337,9 +337,10 @@ 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 not combine_as_imports, move aliased imports to the end so that - # non-aliased imports stay grouped together in a single block - if not config.combine_as_imports and as_imports: + # 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 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