Sample

pyint-ad505c3c1397-I13

Lower every eligible synchronous for loop to a while loop

Matched original source

Lines275

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.10–1; higher is more readable
Mi0.5830–1; higher is more readable
LLOC77Logical lines; fewer is more readable
DeepSeek V4 Pro100–20; mean of three runs
GPT-6.1 Sol14.670–20; mean of three runs
BTTF0.4970–1; higher is more readable

Views

Source code

from __future__ import annotations import abc import contextlib import enum import itertools import linecache import sys import types import unicodedata import weakref from collections.abc import Callable, Mapping from functools import cached_property from typing import Any, NamedTuple, TypeVar from . import _compat, _config, setters from ._compat import ( PY_3_11_PLUS, PY_3_13_PLUS, _AnnotationExtractor, _get_annotations, _lazy_is_generator, get_generic_base, ) from .exceptions import ( DefaultAlreadySetError, FrozenInstanceError, NotAnAttrsClassError, UnannotatedAttributeError, ) class Attribute: """ *Read-only* representation of an attribute. .. warning:: You should never instantiate this class yourself. The class has *all* arguments of `attr.ib` (except for ``factory`` which is only syntactic sugar for ``default=Factory(...)`` plus the following: - ``name`` (`str`): The name of the attribute. - ``alias`` (`str`): The __init__ parameter name of the attribute, after any explicit overrides and default private-attribute-name handling. - ``alias_is_default`` (`bool`): Whether the ``alias`` was automatically generated (``True``) or explicitly provided by the user (``False``). - ``inherited`` (`bool`): Whether or not that attribute has been inherited from a base class. - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables that are used for comparing and ordering objects by this attribute, respectively. These are set by passing a callable to `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also :ref:`comparison customization <custom-comparison>`. Instances of this class are frequently used for introspection purposes like: - `fields` returns a tuple of them. - Validators get them passed as the first argument. - The :ref:`field transformer <transform-fields>` hook receives a list of them. - The ``alias`` property exposes the __init__ parameter name of the field, with any overrides and default private-attribute handling applied. .. versionadded:: 20.1.0 *inherited* .. versionadded:: 20.1.0 *on_setattr* .. versionchanged:: 20.2.0 *inherited* is not taken into account for equality checks and hashing anymore. .. versionadded:: 21.1.0 *eq_key* and *order_key* .. versionadded:: 22.2.0 *alias* .. versionadded:: 26.1.0 *alias_is_default* For the full version history of the fields, see `attr.ib`. """ # These slots must NOT be reordered because we use them later for # instantiation. __slots__ = ( # noqa: RUF023 "name", "default", "validator", "repr", "eq", "eq_key", "order", "order_key", "hash", "init", "metadata", "type", "converter", "kw_only", "inherited", "on_setattr", "alias", "alias_is_default", ) def __init__( self, name, default, validator, repr, cmp, # XXX: unused, remove along with other cmp code. hash, init, inherited, metadata=None, type=None, converter=None, kw_only=False, eq=None, eq_key=None, order=None, order_key=None, on_setattr=None, alias=None, alias_is_default=None, ): eq, eq_key, order, order_key = _determine_attrib_eq_order( cmp, eq_key or eq, order_key or order, True ) # Cache this descriptor here to speed things up later. bound_setattr = _OBJ_SETATTR.__get__(self) # Despite the big red warning, people *do* instantiate `Attribute` # themselves. bound_setattr("name", name) bound_setattr("default", default) bound_setattr("validator", validator) bound_setattr("repr", repr) bound_setattr("eq", eq) bound_setattr("eq_key", eq_key) bound_setattr("order", order) bound_setattr("order_key", order_key) bound_setattr("hash", hash) bound_setattr("init", init) bound_setattr("converter", converter) bound_setattr( "metadata", ( types.MappingProxyType(dict(metadata)) # Shallow copy if metadata else _EMPTY_METADATA_SINGLETON ), ) bound_setattr("type", type) bound_setattr("kw_only", kw_only) bound_setattr("inherited", inherited) bound_setattr("on_setattr", on_setattr) bound_setattr("alias", alias) bound_setattr( "alias_is_default", alias is None if alias_is_default is None else alias_is_default, ) def __setattr__(self, name, value): raise FrozenInstanceError @classmethod def from_counting_attr( cls, name: str, ca: _CountingAttr, kw_only: bool, type=None ): # The 'kw_only' argument is the class-level setting, and is used if the # attribute itself does not explicitly set 'kw_only'. # type holds the annotated value. deal with conflicts: if type is None: type = ca.type elif ca.type is not None: msg = f"Type annotation and type argument cannot both be present for '{name}'." raise ValueError(msg) return cls( name, ca._default, ca._validator, ca.repr, None, ca.hash, ca.init, False, ca.metadata, type, ca._converter, kw_only if ca.kw_only is None else ca.kw_only, ca.eq, ca.eq_key, ca.order, ca.order_key, ca.on_setattr, ca.alias, ca.alias is None, ) # Don't use attrs.evolve since fields(Attribute) doesn't work def evolve(self, **changes): """ Copy *self* and apply *changes*. This works similarly to `attrs.evolve` but that function does not work with :class:`attrs.Attribute`. It is mainly meant to be used for `transform-fields`. .. versionadded:: 20.3.0 """ import copy new = copy.copy(self) new._setattrs(changes.items()) if "alias" in changes and "alias_is_default" not in changes: # Explicit alias provided -- no longer the default. _OBJ_SETATTR.__get__(new)("alias_is_default", False) elif ( "name" in changes and "alias" not in changes # Don't auto-generate alias if the user picked picked the old one. and self.alias_is_default ): # Name changed, alias was auto-generated -- update it. _OBJ_SETATTR.__get__(new)( "alias", _default_init_alias_for(new.name) ) return new # Don't use _add_pickle since fields(Attribute) doesn't work def __getstate__(self): """ Play nice with pickle. """ return tuple( getattr(self, name) if name != "metadata" else dict(self.metadata) for name in self.__slots__ ) def __setstate__(self, state): """ Play nice with pickle. """ if len(state) < len(self.__slots__): # Pre-26.1.0 pickle without alias_is_default -- infer it # heuristically. state_dict = dict(zip(self.__slots__, state, strict=False)) alias_is_default = state_dict.get( "alias" ) is None or state_dict.get("alias") == _default_init_alias_for( state_dict["name"] ) state = (*state, alias_is_default) self._setattrs(zip(self.__slots__, state, strict=True)) def _setattrs(self, name_values_pairs): bound_setattr = _OBJ_SETATTR.__get__(self) loopIterator = __import__("builtins").iter(name_values_pairs) while True: try: name, value = __import__("builtins").next(loopIterator) except __import__("builtins").StopIteration: break if name != "metadata": bound_setattr(name, value) else: bound_setattr( name, ( types.MappingProxyType(dict(value)) if value else _EMPTY_METADATA_SINGLETON ), )

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.5820.933−192.091
Source linesThe number of non-empty source lines.275+110
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.382−6.573

Intercept 8.87 + feature contributions = -79.793 (log-odds).
Score = sigmoid(-79.793) = 0.

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.276−8.736
Indentation frequencyHow rapidly indentation changes from line to line.201+6.215
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.201−4.191
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.274.967+3.434
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.90.957+0.663
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.042+0.531
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.90.946−0.187

Intercept 0.07 + feature contributions = -2.201 (log-odds).
Score = sigmoid(-2.201) = 0.1.

Score0.583
Score77
Run 1

The code demonstrates good documentation and logical class structure, but has significant readability issues. (1) Structure: clear class organization with well-documented slots, though import statements are scattered across multiple lines. (2) Nesting: mostly flat, but `_setattrs` uses an unnecessarily manual while-loop with try/except instead of a simple for-loop, creating convoluted logic. (3) Clarity of intent: docstrings are excellent, but the weird `__import__('builtins').iter/next` pattern obscures intent when `iter()` and `next()` builtins would work. (4) Length: verbose but justified by complex initialization logic; the manual iterator loop adds unnecessary length. (5) Action granularity: mostly one action per line, though the metadata handling mixes conditionals inline. (6) Reading flow: natural top-to-bottom flow in `__init__`, but jarring in `_setattrs` due to the unnatural builtin import workaround and while-loop structure.

Run 2

The code has clear intent and good documentation, especially the Attribute class docstring and __slots__ organization. However, readability suffers from several issues: the _setattrs method uses unnecessarily obscure constructs like __import__('builtins') and manual while/next iteration instead of a simple for loop; the __init__ method has many parameters and repetitive bound_setattr calls that could be simplified; some comments reference legacy behavior (e.g., 'cmp: unused'). While the overall structure is logical with clear separation of concerns, the action granularity is inconsistent, and the nested conditional logic in evolve() adds complexity. The code is moderately readable but would benefit from simplification and modern Python idioms.

Run 3

The code is severely compromised by deliberate obfuscation in the `_setattrs` method. The use of `__import__('builtins').iter()` and `__import__('builtins').next()` with a manual `while True`/`try/except StopIteration` loop is unnecessarily cryptic and replaces what should be a simple `for` loop. This single method destroys readability across multiple criteria: it obscures intent, violates one-action-per-line by embedding imports in expressions, breaks natural reading flow, and adds unnecessary length. While the rest of the file shows generally good structure with clear docstrings, reasonable nesting, and organized imports, the `_setattrs` method is so egregious that it drags the overall score down dramatically. The contrast between the otherwise professional quality and this one terrible method suggests intentional obfuscation, making the code unreliable and unreadable in practice.

Run 1

Code Structure: The class is logically organized into initialization, conversion, copying, serialization, and internal mutation methods. Nesting: Most methods are shallow, although _setattrs introduces an unnecessary while/try/except structure instead of a simple for loop. Clarity of intent: Descriptive method names, extensive documentation, and explanatory comments help, but dynamic builtins imports, positional constructor arguments, and order-dependent slots obscure details. Code length: Repeated field assignments and lengthy documentation increase scanning effort; the manual iteration adds avoidable verbosity. Action granularity: Most statements perform one clear action, though tuple unpacking and compound conditional expressions require additional attention. Reading flow: Method boundaries and consistent formatting generally support natural reading, but the long constructor, dense compatibility logic, awkward line wrapping in __setstate__, and inconsistent loopIterator naming interrupt it.

Run 2

Code Structure: The class is logically organized into initialization, construction, copying, and serialization methods, though numerous unrelated imports add clutter. Nesting: Mostly shallow; metadata handling and the manual iterator loop introduce modest complexity. Clarity of intent: Descriptive method names, documentation, and comments explain immutability and compatibility behavior. However, the large positional constructor call, external helpers, and repeated dynamic builtins imports obscure details. Code length: Extensive documentation and repetitive field assignments are largely justified, but _setattrs is unnecessarily verbose compared with a standard for loop. Action granularity: Statements generally perform one action each, making operations easy to track. Reading flow: Method boundaries and consistent formatting support natural reading, but order-dependent slots, long argument lists, and awkwardly wrapped alias inference require cross-referencing and interrupt the flow.

Run 3

Code Structure: The class is logically organized into initialization, copying, serialization, and attribute-setting methods, although many imports are irrelevant to this excerpt. Nesting: Most logic is shallow; the manual iterator loop adds avoidable nesting. Clarity of intent: Descriptive method names, documentation, and comments explain immutability and compatibility behavior. However, the long positional constructor call and reliance on slot ordering obscure field correspondence. Code length: Repetitive assignments are understandable, but extensive documentation and the unnecessarily expanded iteration increase reading effort. Action granularity: Statements generally perform one action per line, with multiline expressions formatted clearly. Reading flow: Related operations are grouped naturally, but repeated dynamic builtins imports, the unconventional loopIterator name, and awkward wrapping in pickle migration logic interrupt the flow. Overall, readable and well documented, with localized complexity and verbosity.