Sample

pyint-91966b1360e8-I12

Inline all eligible single-use intermediate local variables

Matched original source

Lines270

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.0750–1; higher is more readable
Mi0.5830–1; higher is more readable
LLOC72Logical lines; fewer is more readable
DeepSeek V4 Pro14.330–20; mean of three runs
GPT-6.1 Sol160–20; mean of three runs
BTTF0.4330–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: raise ValueError((f"Type annotation and type argument cannot both be present for '{name}'.")) 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) for name, value in name_values_pairs: 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.5508.226−181.771
Source linesThe number of non-empty source lines.270+108
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.383−6.574

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

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.271−8.559
Indentation frequencyHow rapidly indentation changes from line to line.196+6.042
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.196−4.077
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.269.981+3.364
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.104.989+0.89
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.104.974−0.781
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.042+0.539

Intercept 0.07 + feature contributions = -2.512 (log-odds).
Score = sigmoid(-2.512) = 0.075.

Score0.583
Score72
Run 1

The code demonstrates strong readability through clear structure (class with logical method grouping), moderate nesting (simple if/else at most 1-2 levels), explicit intent with descriptive comments and docstrings, and appropriate line length. Each line performs a single action, and the reading flow follows a natural top-down progression. The use of helper methods and clear naming conventions enhance comprehension. Some minor inconsistencies exist, such as a stray empty line before raising an error and slight verbosity in the __init__ parameter list, but overall this is highly maintainable code.

Run 2

The code demonstrates moderate readability, benefiting from clear class structure and helpful comments. However, several patterns reduce clarity. The __init__ method is lengthy and contains a mix of validation, caching, and attribute-setting that could be extracted. Magic methods like __getstate__/__setstate__ have dense logic with conditional branching. Some comments are helpful ('Cache this descriptor here'), but others reference future changes ('unused, remove along with other cmp code') without clear context. Variable names like 'ca' and '_CountingAttr' are cryptic. The use of bound_setattr obscures direct assignment, and metadata handling logic repeats across methods. The docstring is thorough but verbose. Nested conditionals in evolve() and __setstate__ create moderate complexity. Alignment with attrs conventions is good, but the code assumes deep familiarity with the library's internals.

Run 3

The code is moderately readable. It has a clear class structure and good documentation, but suffers from several issues. The constructor (__init__) has too many parameters and multiple assignments, making it hard to follow. The from_counting_attr method contains an awkward blank line and some confusing logic. Action granularity is reasonable but there are some multi-action lines. Nesting is relatively flat overall, which is good. The code uses dataclass-like slots and caching appropriately, but the length is excessive for what it does. The intent of each method is generally clear through naming and docstrings, but implementation details like _OBJ_SETATTR.__get__ pattern are cryptic. Type hints are inconsistent - some parameters have them, many don't. The code would benefit from simplification, better parameter organization, and more consistent typing. Overall it's readable enough for experienced Python developers familiar with the attrs library, but not intuitive for newcomers.

Run 1

Code Structure: Well-organized class with distinct methods for initialization, copying, serialization, and internal updates. Nesting: Mostly flat, with shallow conditionals and loops; multiline expressions add some visual complexity. Clarity of intent: Descriptive method names, extensive documentation, and explanatory comments clarify behavior, although internal helpers, descriptor manipulation, and abbreviated names require context. Code length: Generally justified, but repetitive field assignments, lengthy documentation, and the large constructor increase reading effort. Action granularity: Nearly every statement performs one action; tuple unpacking remains understandable. Reading flow: Methods follow a coherent progression, but the long positional constructor call requires matching arguments against the signature and slot order. Awkward line wrapping, a redundant parenthesized exception expression, and minor comment errors slightly disrupt otherwise consistent formatting.

Run 2

Code Structure: Methods are logically separated by responsibility, with documentation explaining invariants and compatibility behavior. Nesting: Mostly flat control flow; conditional expressions and metadata handling add modest complexity. Clarity of intent: Descriptive method names and comments make immutability, copying, and serialization understandable, but internal helpers, abbreviated parameters, and the long positional constructor call require extra context. Code length: Repetitive field assignments and extensive documentation increase length, although much serves a clear purpose; the unused cmp parameter adds clutter. Action granularity: Statements generally perform one action each, making execution easy to follow. Reading flow: Consistent organization supports natural reading, but awkward line wrapping, a redundant pair of parentheses, inconsistent whitespace, and dependence on slot ordering interrupt the flow.

Run 3

Code Structure: Methods are logically separated by responsibility, with documentation explaining immutability, copying, and serialization. Nesting: Generally shallow; conditional expressions and multiline conditions add some complexity without deeply nested control flow. Clarity of intent: Descriptive method names and helpful comments make the purpose clear, although external helpers, descriptor-based assignment, and a long positional constructor call require additional context. Code length: Repeated field assignments and extensive documentation increase length, but most serve a clear purpose; metadata conversion is duplicated. Action granularity: Statements generally perform one action each, making execution easy to follow. Reading flow: Consistent organization supports natural reading, but the slot-order dependency, numerous constructor parameters, awkward formatting in the ValueError statement and pickle compatibility expression, and unused cmp parameter introduce friction.