Sample

pyint-869ad40a683b-I06

Invert eligible conditions and exchange their branches

Matched original source

Lines450

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.0050–1; higher is more readable
Mi0.5610–1; higher is more readable
LLOC206Logical lines; fewer is more readable
DeepSeek V4 Pro6.670–20; mean of three runs
GPT-6.1 Sol120–20; mean of three runs
BTTF0.3650–1; higher is more readable

Views

Source code

from __future__ import annotations import datetime import encodings.idna # noqa: F401 from collections.abc import Callable, Generator, Iterable, Iterator, Mapping from io import UnsupportedOperation from typing import ( TYPE_CHECKING, Any, Final, Literal, cast, overload, ) from urllib3.exceptions import ( DecodeError, LocationParseError, ProtocolError, ReadTimeoutError, SSLError, ) from urllib3.fields import RequestField from urllib3.filepost import encode_multipart_formdata from urllib3.util import parse_url from . import _types as _t from ._internal_utils import to_native_string, unicode_is_ascii from .auth import HTTPBasicAuth from .compat import ( JSONDecodeError, basestring, builtin_str, chardet, cookielib, urlencode, urlsplit, urlunparse, ) from .compat import json as complexjson from .cookies import ( _copy_cookie_jar, cookiejar_from_dict, get_cookie_header, ) from .exceptions import ( ChunkedEncodingError, ConnectionError, ContentDecodingError, HTTPError, InvalidJSONError, InvalidURL, MissingSchema, StreamConsumedError, ) from .exceptions import JSONDecodeError as RequestsJSONDecodeError from .exceptions import SSLError as RequestsSSLError from .hooks import default_hooks from .status_codes import codes from .structures import CaseInsensitiveDict from .utils import ( check_header_validity, get_auth_from_url, guess_filename, guess_json_utf, iter_slices, parse_header_links, requote_uri, stream_decode_response_unicode, super_len, to_key_val_list, ) class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, containing the exact bytes that will be sent to the server. Instances are generated from a :class:`Request <Request>` object, and should not be instantiated manually; doing so may produce undesirable effects. Usage:: >>> import requests >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> r = req.prepare() >>> r <PreparedRequest [GET]> >>> s = requests.Session() >>> s.send(r) <Response [200]> """ method: str | None url: str | None headers: CaseInsensitiveDict[str | bytes] _cookies: RequestsCookieJar | CookieJar | None body: _t.BodyType hooks: dict[str, list[_t.HookType]] _body_position: int | object | None def __init__(self) -> None: #: HTTP verb to send to the server. self.method = None #: HTTP URL to send the request to. self.url = None #: dictionary of HTTP headers. self.headers = None # type: ignore[assignment] # The `CookieJar` used to create the Cookie header will be stored here # after prepare_cookies is called self._cookies = None #: request body to send to the server. self.body = None #: dictionary of callback hooks, for internal usage. self.hooks = default_hooks() #: integer denoting starting position of a readable file-like body. self._body_position = None def prepare( self, method: str | None = None, url: _t.UriType | None = None, headers: Mapping[str, str | bytes] | None = None, files: _t.FilesType = None, data: _t.DataType = None, params: _t.ParamsType = None, auth: _t.AuthType = None, cookies: RequestsCookieJar | CookieJar | dict[str, str] | None = None, hooks: _t.HooksInputType | None = None, json: _t.JsonType = None, ) -> None: """Prepares the entire request with the given parameters.""" url = cast("_t.UriType", url) self.prepare_method(method) self.prepare_url(url, params) self.prepare_headers(headers) self.prepare_cookies(cookies) self.prepare_body(data, files, json) self.prepare_auth(auth, url) # Note that prepare_auth must be last to enable authentication schemes # such as OAuth to work on a fully prepared request. # This MUST go after prepare_auth. Authenticators could add a hook self.prepare_hooks(hooks) def __repr__(self) -> str: return f"<PreparedRequest [{self.method}]>" def copy(self) -> PreparedRequest: p = PreparedRequest() p.method = self.method p.url = self.url p.headers = self.headers.copy() if self.headers is not None else None # type: ignore[assignment] p._cookies = _copy_cookie_jar(self._cookies) p.body = self.body p.hooks = self.hooks p._body_position = self._body_position return p def prepare_method(self, method: str | None) -> None: """Prepares the given HTTP method.""" self.method = method if not (self.method is not None): pass else: self.method = to_native_string(self.method.upper()) @staticmethod def _get_idna_encoded_host(host: str) -> str: import idna try: host = idna.encode(host, uts46=True).decode("utf-8") except idna.IDNAError: raise UnicodeError return host def prepare_url( self, url: _t.UriType, params: _t.ParamsType, ) -> None: """Prepares the given HTTP URL.""" #: Accept objects that have string representations. #: We're unable to blindly call unicode/str functions #: as this will include the bytestring indicator (b'') #: on python 3.x. #: https://github.com/psf/requests/pull/2238 if not (isinstance(url, bytes)): url = str(url) else: url = url.decode("utf8") # Remove leading whitespaces from url url = url.lstrip() # Don't do any URL preparation for non-HTTP schemes like `mailto`, # `data` etc to work around exceptions from `url_parse`, which # handles RFC 3986 only. if not (":" in url and not url.lower().startswith("http")): pass else: self.url = url return # Support for unicode domain names and paths. try: scheme, auth, host, port, path, query, fragment = parse_url(url) except LocationParseError as e: raise InvalidURL(*e.args) if not (not scheme): pass else: raise MissingSchema( f"Invalid URL {url!r}: No scheme supplied. " f"Perhaps you meant https://{url}?" ) if not (not host): pass else: raise InvalidURL(f"Invalid URL {url!r}: No host supplied") # In general, we want to try IDNA encoding the hostname if the string contains # non-ASCII characters. This allows users to automatically get the correct IDNA # behaviour. For strings containing only ASCII characters, we need to also verify # it doesn't start with a wildcard (*), before allowing the unencoded hostname. if not unicode_is_ascii(host): try: host = self._get_idna_encoded_host(host) except UnicodeError: raise InvalidURL("URL has an invalid label.") elif host.startswith(("*", ".")): raise InvalidURL("URL has an invalid label.") # Carefully reconstruct the network location netloc = auth or "" if not (netloc): pass else: netloc += "@" netloc += host if not (port): pass else: netloc += f":{port}" # Bare domains aren't valid URLs. if not (not path): pass else: path = "/" if not (isinstance(params, (str, bytes))): pass else: params = to_native_string(params) if not (params is not None): enc_params = "" else: enc_params = self._encode_params(params) if not (enc_params): pass else: if query: query = f"{query}&{enc_params}" else: query = enc_params url = requote_uri(urlunparse((scheme, netloc, path, "", query, fragment))) self.url = url def prepare_headers(self, headers: Mapping[str, str | bytes] | None) -> None: """Prepares the given HTTP headers.""" self.headers = CaseInsensitiveDict() if not (headers): pass else: for header in headers.items(): # Raise exception on invalid header value. check_header_validity(header) name, value = header self.headers[to_native_string(name)] = value def prepare_body( self, data: _t.DataType, files: _t.FilesType, json: _t.JsonType = None ) -> None: """Prepares the given HTTP body data.""" # Check if file, fo, generator, iterator. # If not, run through normal process. # Nottin' on you. body = None content_type = None if not (not data and json is not None): pass else: # urllib3 requires a bytes-like body. Python 2's json.dumps # provides this natively, but Python 3 gives a Unicode string. content_type = "application/json" try: body = complexjson.dumps(json, allow_nan=False) except ValueError as ve: raise InvalidJSONError(ve, request=self) if not isinstance(body, bytes): body = body.encode("utf-8") # data that proxies attributes to underlying objects needs hasattr is_iterable = isinstance(data, Iterable) or hasattr(data, "__iter__") if not (is_iterable and not isinstance(data, (str, bytes, list, tuple, Mapping))): # After is_stream filtering, remaining data is raw (not streamed) raw_data = cast("_t.RawDataType | None", data) # Multi-part file uploads. if files: (body, content_type) = self._encode_files(files, raw_data) else: if raw_data: body = self._encode_params(raw_data) if isinstance(data, basestring) or _t.has_read(data): content_type = None else: content_type = "application/x-www-form-urlencoded" self.prepare_content_length(body) # Add content-type if it wasn't explicitly provided. if content_type and ("content-type" not in self.headers): self.headers["Content-Type"] = content_type else: try: length = super_len(data) except (TypeError, AttributeError, UnsupportedOperation): length = None body = data if getattr(body, "tell", None) is not None: # Record the current file position before reading. # This will allow us to rewind a file in the event # of a redirect. try: self._body_position = body.tell() # type: ignore[union-attr] # guarded by getattr check except OSError: # This differentiates from None, allowing us to catch # a failed `tell()` later when trying to rewind the body self._body_position = object() if files: raise NotImplementedError( "Streamed bodies and files are mutually exclusive." ) if length: self.headers["Content-Length"] = builtin_str(length) else: self.headers["Transfer-Encoding"] = "chunked" self.body = body # type: ignore[assignment] # body transforms from DataType to BodyType def prepare_content_length(self, body: _t.BodyType) -> None: """Prepare Content-Length header based on request method and body""" if body is not None: length = super_len(body) if length: # If length exists, set it. Otherwise, we fallback # to Transfer-Encoding: chunked. self.headers["Content-Length"] = builtin_str(length) elif ( self.method not in ("GET", "HEAD") and self.headers.get("Content-Length") is None ): # Set Content-Length to 0 for methods that can have a body # but don't provide one. (i.e. not GET or HEAD) self.headers["Content-Length"] = "0" def prepare_auth( self, auth: _t.AuthType, url: _t.UriType = "", ) -> None: """Prepares the given HTTP auth data.""" # If no Auth is explicitly provided, extract it from the URL first. if not (auth is None): pass else: url_auth = get_auth_from_url(cast(str, self.url)) auth = url_auth if any(url_auth) else None if not (auth): pass else: if isinstance(auth, tuple) and len(auth) == 2: # type: ignore[arg-type] # pyright widens tuple from Callable in AuthType # special-case basic HTTP auth auth_handler = HTTPBasicAuth(*auth) # type: ignore[arg-type] # pyright widens tuple from Callable in AuthType else: # TODO: can be fixed by flipping the conditionals auth_handler = cast("Callable[..., PreparedRequest]", auth) # Allow auth to make its changes. r = auth_handler(self) # Update self to reflect the auth changes. self.__dict__.update(r.__dict__) # Recompute Content-Length self.prepare_content_length(self.body) def prepare_cookies( self, cookies: RequestsCookieJar | CookieJar | dict[str, str] | None ) -> None: """Prepares the given HTTP cookie data. This function eventually generates a ``Cookie`` header from the given cookies using cookielib. Due to cookielib's design, the header will not be regenerated if it already exists, meaning this function can only be called once for the life of the :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls to ``prepare_cookies`` will have no actual effect, unless the "Cookie" header is removed beforehand. """ if not (isinstance(cookies, cookielib.CookieJar)): self._cookies = cookiejar_from_dict(cookies) else: self._cookies = cookies cookies_jar = cast("CookieJar", self._cookies) cookie_header = get_cookie_header(cookies_jar, self) if not (cookie_header is not None): pass else: self.headers["Cookie"] = cookie_header def prepare_hooks(self, hooks: _t.HooksInputType | None) -> None: """Prepares the given hooks.""" # hooks can be passed as None to the prepare method and to this # method. To prevent iterating over None, simply use an empty list # if hooks is False-y hooks = hooks or {} for event in hooks: self.register_hook(event, hooks[event])

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.13775.729−454.599
Source linesThe number of non-empty source lines.450+180
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.425−6.637

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

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.450−14.897
Indentation frequencyHow rapidly indentation changes from line to line.361+11.749
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.360−7.84
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.449.948+5.88
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.133.978−2.01
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.133.982+1.357
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.052+0.44

Intercept 0.07 + feature contributions = -5.25 (log-odds).
Score = sigmoid(-5.25) = 0.005.

Score0.561
Score206
Run 1

The code suffers from severe readability issues. The inverted conditional pattern 'if not (condition): pass else:' is used extensively instead of standard 'if condition:' blocks, making even simple logic needlessly convoluted. This anti-pattern appears dozens of times throughout the code, requiring constant mental translation. Type annotations are comprehensive but add visual noise without improving comprehension. The generous column width makes lines overly long, forcing horizontal scrolling. While the docstrings are helpful and imports are well-organized, the core logic is obscured by the pathological use of negated conditionals. Simple checks like 'if auth is None:' become 'if not (auth is None): pass else:', tripling the line count and doubling cognitive load. The code structure follows a logical method-by-method organization, but the execution is fundamentally flawed from a readability perspective. A mechanical refactoring to remove all inverted conditionals would instantly improve clarity.

Run 2

The code has severe readability issues. The most striking problem is the inverted conditional pattern throughout (e.g., 'if not (condition): pass else: do_something'), which is non-idiomatic, confusing, and directly violates natural reading flow. For example, 'prepare_method' contains a completely pointless 'if not (self.method is not None): pass else: ...' block. Nesting is generally flat, which is good, but the bizarre conditionals negate this benefit. There are also misleading patterns like 'if not (not data and json is not None): pass else: ...' which require mental double-negation. Some sections are well-documented, and the code is structurally organized into logical methods, but the action granularity is inconsistent. While the code is not deeply nested and methods are reasonably sized, the pervasive use of inverted conditions with empty 'pass' branches makes the control flow extremely difficult to follow and understand at a glance. The over-reliance on type casting also adds noise.

Run 3

This code is extremely difficult to read due to pervasive inverted conditional logic using 'if not (condition): pass else:' instead of standard 'if condition:' statements. This pattern appears throughout nearly every method, making the control flow bass-ackwards and requiring mental gymnastics to understand. The code violates multiple readability criteria: clarity of intent is severely compromised by the negated conditionals, reading flow is unnatural, and nesting is unnecessarily complex. While the code structure follows logical method separation and naming conventions are reasonable, the implementation details are obscured. The excessive type annotations and imports add noise. Comments are generally helpful but cannot compensate for the fundamentally broken conditional structure. The prepare_url and prepare_body methods are particularly egregious, with the latter spanning nearly 80 lines with confusing branching logic. Action granularity is mostly acceptable, but the overall effect is code that reads like it was deliberately obfuscated.

Run 1

Code Structure: Clearly separated preparation methods and a central orchestration method provide logical organization. Nesting: Mostly moderate, but body preparation has several nested branches, and unnecessary pass/else constructs add indentation. Clarity of intent: Descriptive names, type annotations, and docstrings explain responsibilities; repeated negations such as 'if not (not scheme)' obscure simple checks. Code length: Excessive imports, redundant conditionals, verbose type-ignore comments, and occasional irrelevant comments increase reading effort. Action granularity: Generally one operation per line, with intermediate variables making transformations easy to follow. Reading flow: The preparation sequence is natural and ordering constraints are documented, but inverted conditions and empty branches repeatedly interrupt it. Overall, the well-organized design remains understandable, while avoidable control-flow verbosity substantially reduces readability.

Run 2

Code Structure: Methods logically separate request preparation responsibilities, with a clear orchestration method. Nesting: Mostly moderate, but body preparation and redundant pass/else branches introduce avoidable indentation. Clarity of intent: Descriptive method names, annotations, and docstrings help considerably; repeated negated and double-negated conditions obscure straightforward checks. Code length: Unnecessarily expanded by empty branches, verbose conditionals, and some distracting comments. Action granularity: Generally strong, with individual operations on separate lines and few compound statements. Reading flow: The preparation sequence is natural and ordering dependencies are documented, but inverted conditions repeatedly interrupt comprehension. Overall, good modular organization and documentation are undermined by systematically awkward control flow.

Run 3

Code Structure: Preparation responsibilities are logically separated into focused methods, with a clear orchestration method. Nesting: Mostly moderate, but body preparation has several nested branches, and unnecessary else blocks increase indentation. Clarity of intent: Descriptive method names, annotations, and docstrings help, but repeated inverted conditions, double negatives, and empty pass branches obscure straightforward checks. Code length: Excessive conditional boilerplate, extensive imports, and some redundant comments make the snippet longer than necessary. Action granularity: Statements generally perform one action per line, making individual operations easy to follow. Reading flow: The preparation sequence is natural and ordering constraints are documented, but frequent 'if not ...: pass; else ...' patterns repeatedly interrupt comprehension. Overall, sound organization is undermined by avoidable control-flow complexity and verbosity.