| """ | |
| Unopinionated display configuration. | |
| """ | |
| from __future__ import annotations | |
| import locale | |
| import sys | |
| from pandas._config import config as cf | |
| # ----------------------------------------------------------------------------- | |
| # Global formatting options | |
| _initial_defencoding: str | None = None | |
| def detect_console_encoding() -> str: | |
| """ | |
| Try to find the most capable encoding supported by the console. | |
| slightly modified from the way IPython handles the same issue. | |
| """ | |
| global _initial_defencoding | |
| encoding = None | |
| try: | |
| encoding = sys.stdout.encoding or sys.stdin.encoding | |
| except (AttributeError, OSError): | |
| pass | |
| # try again for something better | |
| if not encoding or "ascii" in encoding.lower(): | |
| try: | |
| encoding = locale.getpreferredencoding() | |
| except locale.Error: | |
| # can be raised by locale.setlocale(), which is | |
| # called by getpreferredencoding | |
| # (on some systems, see stdlib locale docs) | |
| pass | |
| # when all else fails. this will usually be "ascii" | |
| if not encoding or "ascii" in encoding.lower(): | |
| encoding = sys.getdefaultencoding() | |
| # GH#3360, save the reported defencoding at import time | |
| # MPL backends may change it. Make available for debugging. | |
| if not _initial_defencoding: | |
| _initial_defencoding = sys.getdefaultencoding() | |
| return encoding | |
| pc_encoding_doc = """ | |
| : str/unicode | |
| Defaults to the detected encoding of the console. | |
| Specifies the encoding to be used for strings returned by to_string, | |
| these are generally strings meant to be displayed on the console. | |
| """ | |
| with cf.config_prefix("display"): | |
| cf.register_option( | |
| "encoding", detect_console_encoding(), pc_encoding_doc, validator=cf.is_text | |
| ) | |