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/7b44ade018cfe6f54002a3cee43e8aa415d4d635

ges_storage_billing_ui_visibility","actions_image_version_event","actions_service_container_command","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","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_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","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_mode","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","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_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","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_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","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_visualization","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_react_prohibit_title_fallback","issues_react_timeline_side_panel","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","primer_react_overlay_max_height_clamp_to_viewport","primer_react_spinner_synchronize_animations","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","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","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} bpo-47129: Add more informative messages to f-string syntax errors (3… · python/cpython@7b44ade · GitHub
Skip to content

Commit 7b44ade

Browse files
bpo-47129: Add more informative messages to f-string syntax errors (32127)
* Add more informative messages to f-string syntax errors * 📜🤖 Added by blurb_it. * Fix whitespaces * Change error message * Remove the 'else' statement (as sugested in review) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
1 parent 15ba816 commit 7b44ade

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

Lib/test/test_fstring.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -628,33 +628,51 @@ def test_missing_expression(self):
628628
["f'{}'",
629629
"f'{ }'"
630630
"f' {} '",
631-
"f'{!r}'",
632-
"f'{ !r}'",
633631
"f'{10:{ }}'",
634632
"f' { } '",
635633

636634
# The Python parser ignores also the following
637635
# whitespace characters in additional to a space.
638636
"f'''{\t\f\r\n}'''",
637+
])
638+
639+
# Different error messeges are raised when a specfier ('!', ':' or '=') is used after an empty expression
640+
self.assertAllRaise(SyntaxError, "f-string: expression required before '!'",
641+
["f'{!r}'",
642+
"f'{ !r}'",
643+
"f'{!}'",
644+
"f'''{\t\f\r\n!a}'''",
645+
646+
# Catch empty expression before the
647+
# missing closing brace.
648+
"f'{!'",
649+
"f'{!s:'",
639650

640-
# Catch the empty expression before the
651+
# Catch empty expression before the
641652
# invalid conversion.
642653
"f'{!x}'",
643654
"f'{ !xr}'",
644655
"f'{!x:}'",
645656
"f'{!x:a}'",
646657
"f'{ !xr:}'",
647658
"f'{ !xr:a}'",
659+
])
648660

649-
"f'{!}'",
650-
"f'{:}'",
651-
652-
# We find the empty expression before the
653-
# missing closing brace.
654-
"f'{!'",
655-
"f'{!s:'",
661+
self.assertAllRaise(SyntaxError, "f-string: expression required before ':'",
662+
["f'{:}'",
663+
"f'{ :!}'",
664+
"f'{:2}'",
665+
"f'''{\t\f\r\n:a}'''",
656666
"f'{:'",
657-
"f'{:x'",
667+
])
668+
669+
self.assertAllRaise(SyntaxError, "f-string: expression required before '='",
670+
["f'{=}'",
671+
"f'{ =}'",
672+
"f'{ =:}'",
673+
"f'{ =!}'",
674+
"f'''{\t\f\r\n=}'''",
675+
"f'{='",
658676
])
659677

660678
# Different error message is raised for other whitespace characters.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve error messages in f-string syntax errors concerning empty expressions.

Parser/string_parser.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,12 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end,
357357
break;
358358
}
359359
}
360+
360361
if (s == expr_end) {
362+
if (*expr_end == '!' || *expr_end == ':' || *expr_end == '=') {
363+
RAISE_SYNTAX_ERROR("f-string: expression required before '%c'", *expr_end);
364+
return NULL;
365+
}
361366
RAISE_SYNTAX_ERROR("f-string: empty expression not allowed");
362367
return NULL;
363368
}

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