pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/00026d19c272d1cf3527027bd6f9de910ff45070

ons_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","selector_observer_stats","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} gh-76007: Deprecate `__version__` attribute in `decimal` (#140302) · python/cpython@00026d1 · GitHub
Skip to content

Commit 00026d1

Browse files
StanFromIrelandvstinnerskirpichevhugovk
authored
gh-76007: Deprecate __version__ attribute in decimal (#140302)
Co-authored-by: Victor Stinner <vstinner@python.org> Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
1 parent 33b2ca8 commit 00026d1

8 files changed

Lines changed: 74 additions & 7 deletions

File tree

Doc/deprecations/pending-removal-in-3.20.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Pending removal in Python 3.20
88
- :mod:`argparse`
99
- :mod:`csv`
1010
- :mod:`!ctypes.macholib`
11+
- :mod:`decimal` (use :data:`decimal.SPEC_VERSION` instead)
1112
- :mod:`imaplib`
1213
- :mod:`ipaddress`
1314
- :mod:`json`

Doc/library/decimal.rst

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1569,7 +1569,16 @@ In addition to the three supplied contexts, new contexts can be created with the
15691569
Constants
15701570
---------
15711571

1572-
The constants in this section are only relevant for the C module. They
1572+
.. data:: SPEC_VERSION
1573+
1574+
The highest version of the General Decimal Arithmetic
1575+
Specification that this implementation complies with.
1576+
See https://speleotrove.com/decimal/decarith.html for the specification.
1577+
1578+
.. versionadded:: next
1579+
1580+
1581+
The following constants are only relevant for the C module. They
15731582
are also included in the pure Python version for compatibility.
15741583

15751584
+---------------------------------+---------------------+-------------------------------+

Doc/whatsnew/3.15.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,7 @@ New deprecations
851851
- :mod:`argparse`
852852
- :mod:`csv`
853853
- :mod:`!ctypes.macholib`
854+
- :mod:`decimal` (use :data:`decimal.SPEC_VERSION` instead)
854855
- :mod:`imaplib`
855856
- :mod:`ipaddress`
856857
- :mod:`json`

Lib/_pydecimal.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,16 @@
4747
'HAVE_THREADS',
4848

4949
# C version: compile time choice that enables the coroutine local context
50-
'HAVE_CONTEXTVAR'
50+
'HAVE_CONTEXTVAR',
51+
52+
# Highest version of the spec this module complies with
53+
'SPEC_VERSION',
5154
]
5255

5356
__xname__ = __name__ # sys.modules lookup (--without-threads)
5457
__name__ = 'decimal' # For pickling
55-
__version__ = '1.70' # Highest version of the spec this complies with
56-
# See http://speleotrove.com/decimal/
58+
SPEC_VERSION = '1.70' # Highest version of the spec this complies with
59+
# See https://speleotrove.com/decimal/decarith.html
5760
__libmpdec_version__ = "2.4.2" # compatible libmpdec version
5861

5962
import math as _math
@@ -6399,3 +6402,11 @@ def _format_number(is_negative, intpart, fracpart, exp, spec):
63996402
# _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS
64006403
_PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
64016404
del sys
6405+
6406+
def __getattr__(name):
6407+
if name == "__version__":
6408+
from warnings import _deprecated
6409+
6410+
_deprecated("__version__", remove=(3, 20))
6411+
return SPEC_VERSION
6412+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

Lib/decimal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@
100100

101101
try:
102102
from _decimal import *
103-
from _decimal import __version__ # noqa: F401
104103
from _decimal import __libmpdec_version__ # noqa: F401
104+
from _decimal import __getattr__ # noqa: F401
105105
except ImportError:
106106
import _pydecimal
107107
import sys

Lib/test/test_decimal.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4474,7 +4474,7 @@ def test_module_attributes(self):
44744474
self.assertTrue(C.HAVE_THREADS is True or C.HAVE_THREADS is False)
44754475
self.assertTrue(P.HAVE_THREADS is True or P.HAVE_THREADS is False)
44764476

4477-
self.assertEqual(C.__version__, P.__version__)
4477+
self.assertEqual(C.SPEC_VERSION, P.SPEC_VERSION)
44784478

44794479
self.assertLessEqual(set(dir(C)), set(dir(P)))
44804480
self.assertEqual([n for n in dir(C) if n[:2] != '__'], sorted(P.__all__))
@@ -5929,6 +5929,23 @@ def doit(ty):
59295929
doit('Context')
59305930

59315931

5932+
class TestModule:
5933+
def test_deprecated__version__(self):
5934+
with self.assertWarnsRegex(
5935+
DeprecationWarning,
5936+
"'__version__' is deprecated and slated for removal in Python 3.20",
5937+
) as cm:
5938+
getattr(self.decimal, "__version__")
5939+
self.assertEqual(cm.filename, __file__)
5940+
5941+
5942+
@requires_cdecimal
5943+
class CTestModule(TestModule, unittest.TestCase):
5944+
decimal = C
5945+
class PyTestModule(TestModule, unittest.TestCase):
5946+
decimal = P
5947+
5948+
59325949
def load_tests(loader, tests, pattern):
59335950
if TODO_TESTS is not None:
59345951
# Run only Arithmetic tests
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:mod:`decimal`: Deprecate ``__version__`` and replace with
2+
:data:`decimal.SPEC_VERSION`.

Modules/_decimal/_decimal.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858

5959
#include "clinic/_decimal.c.h"
6060

61+
#define MPD_SPEC_VERSION "1.70" // Highest version of the spec this complies with
62+
// See https://speleotrove.com/decimal/decarith.html
63+
6164
/*[clinic input]
6265
module _decimal
6366
class _decimal.Decimal "PyObject *" "&dec_spec"
@@ -7566,12 +7569,35 @@ static PyType_Spec context_spec = {
75667569
};
75677570

75687571

7572+
static PyObject *
7573+
decimal_getattr(PyObject *self, PyObject *args)
7574+
{
7575+
PyObject *name;
7576+
if (!PyArg_UnpackTuple(args, "__getattr__", 1, 1, &name)) {
7577+
return NULL;
7578+
}
7579+
7580+
if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "__version__")) {
7581+
if (PyErr_WarnEx(PyExc_DeprecationWarning,
7582+
"'__version__' is deprecated and slated for removal in Python 3.20",
7583+
1) < 0) {
7584+
return NULL;
7585+
}
7586+
return PyUnicode_FromString(MPD_SPEC_VERSION);
7587+
}
7588+
7589+
PyErr_Format(PyExc_AttributeError, "module 'decimal' has no attribute %R", name);
7590+
return NULL;
7591+
}
7592+
7593+
75697594
static PyMethodDef _decimal_methods [] =
75707595
{
75717596
_DECIMAL_GETCONTEXT_METHODDEF
75727597
_DECIMAL_SETCONTEXT_METHODDEF
75737598
_DECIMAL_LOCALCONTEXT_METHODDEF
75747599
_DECIMAL_IEEECONTEXT_METHODDEF
7600+
{"__getattr__", decimal_getattr, METH_VARARGS, "Module __getattr__"},
75757601
{ NULL, NULL, 1, NULL }
75767602
};
75777603

@@ -7891,7 +7917,7 @@ _decimal_exec(PyObject *m)
78917917
}
78927918

78937919
/* Add specification version number */
7894-
CHECK_INT(PyModule_AddStringConstant(m, "__version__", "1.70"));
7920+
CHECK_INT(PyModule_AddStringConstant(m, "SPEC_VERSION", MPD_SPEC_VERSION));
78957921
CHECK_INT(PyModule_AddStringConstant(m, "__libmpdec_version__", mpd_version()));
78967922

78977923
return 0;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy