mirror of
				https://github.com/astral-sh/ruff.git
				synced 2025-10-31 12:05:57 +00:00 
			
		
		
		
	[flake8-comprehension] Mark autofix for C420 as unsafe if there's comments inside the dict comprehension (#18768)
				
					
				
			This commit is contained in:
		
							parent
							
								
									06da2c808f
								
							
						
					
					
						commit
						65b288b45b
					
				
					 3 changed files with 66 additions and 2 deletions
				
			
		|  | @ -90,3 +90,14 @@ def func(): | |||
| 
 | ||||
| def func(): | ||||
|     {(a, b): a + b for (a, b) in [(1, 2), (3, 4)]}  # OK | ||||
| 
 | ||||
| # https://github.com/astral-sh/ruff/issues/18764 | ||||
| { # 1 | ||||
| a # 2 | ||||
| : # 3 | ||||
| None # 4 | ||||
| for # 5 | ||||
| a # 6 | ||||
| in # 7 | ||||
| iterable # 8 | ||||
| } # 9 | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| use ast::ExprName; | ||||
| use ruff_diagnostics::Applicability; | ||||
| use ruff_macros::{ViolationMetadata, derive_message_formats}; | ||||
| use ruff_python_ast::comparable::ComparableExpr; | ||||
| use ruff_python_ast::helpers::any_over_expr; | ||||
|  | @ -31,6 +32,19 @@ use crate::{Edit, Fix, FixAvailability, Violation}; | |||
| /// dict.fromkeys(iterable, 1)
 | ||||
| /// ```
 | ||||
| ///
 | ||||
| /// ## Fix safety
 | ||||
| /// This rule's fix is marked as unsafe if there's comments inside the dict comprehension,
 | ||||
| /// as comments may be removed.
 | ||||
| ///
 | ||||
| /// For example, the fix would be marked as unsafe in the following case:
 | ||||
| /// ```python
 | ||||
| /// {  # comment 1
 | ||||
| ///     a:  # comment 2
 | ||||
| ///     None  # comment 3
 | ||||
| ///     for a in iterable  # comment 4
 | ||||
| /// }
 | ||||
| /// ```
 | ||||
| ///
 | ||||
| /// ## References
 | ||||
| /// - [Python documentation: `dict.fromkeys`](https://docs.python.org/3/library/stdtypes.html#dict.fromkeys)
 | ||||
| #[derive(ViolationMetadata)] | ||||
|  | @ -121,7 +135,7 @@ pub(crate) fn unnecessary_dict_comprehension_for_iterable( | |||
|     ); | ||||
| 
 | ||||
|     if checker.semantic().has_builtin_binding("dict") { | ||||
|         diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( | ||||
|         let edit = Edit::range_replacement( | ||||
|             checker | ||||
|                 .generator() | ||||
|                 .expr(&fix_unnecessary_dict_comprehension( | ||||
|  | @ -129,7 +143,15 @@ pub(crate) fn unnecessary_dict_comprehension_for_iterable( | |||
|                     generator, | ||||
|                 )), | ||||
|             dict_comp.range(), | ||||
|         ))); | ||||
|         ); | ||||
|         diagnostic.set_fix(Fix::applicable_edit( | ||||
|             edit, | ||||
|             if checker.comment_ranges().intersects(dict_comp.range()) { | ||||
|                 Applicability::Unsafe | ||||
|             } else { | ||||
|                 Applicability::Safe | ||||
|             }, | ||||
|         )); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -202,3 +202,34 @@ C420.py:59:6: C420 [*] Unnecessary dict comprehension for iterable; use `dict.fr | |||
| 60 60 |  | ||||
| 61 61 |  | ||||
| 62 62 | # Non-violation cases: RUF025 | ||||
| 
 | ||||
| C420.py:95:1: C420 [*] Unnecessary dict comprehension for iterable; use `dict.fromkeys` instead | ||||
|     | | ||||
|  94 |   # https://github.com/astral-sh/ruff/issues/18764 | ||||
|  95 | / { # 1 | ||||
|  96 | | a # 2 | ||||
|  97 | | : # 3 | ||||
|  98 | | None # 4 | ||||
|  99 | | for # 5 | ||||
| 100 | | a # 6 | ||||
| 101 | | in # 7 | ||||
| 102 | | iterable # 8 | ||||
| 103 | | } # 9 | ||||
|     | |_^ C420 | ||||
|     | | ||||
|     = help: Replace with `dict.fromkeys(iterable, value)`) | ||||
| 
 | ||||
| ℹ Unsafe fix | ||||
| 92 92 |     {(a, b): a + b for (a, b) in [(1, 2), (3, 4)]}  # OK | ||||
| 93 93 |  | ||||
| 94 94 | # https://github.com/astral-sh/ruff/issues/18764 | ||||
| 95    |-{ # 1 | ||||
| 96    |-a # 2 | ||||
| 97    |-: # 3 | ||||
| 98    |-None # 4 | ||||
| 99    |-for # 5 | ||||
| 100    |-a # 6 | ||||
| 101    |-in # 7 | ||||
| 102    |-iterable # 8 | ||||
| 103    |-} # 9 | ||||
|    95 |+dict.fromkeys(iterable) # 9 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Hugo Gomes
						Victor Hugo Gomes