[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML

news2024/11/23 2:50:30

文章目录

  • Python 和 TOML:新最好的朋友
  • 使用Python加载TOML
    • 使用tomli 或 tomllib 读取TOML文档
    • 比较TOML类型和Python类型
    • 在项目中使用配置文件
  • 将Python对象转换为TOML
    • 将字典转换为 TOML
    • 通过tomli_w 写TOML文档
  • 创建新的TOML文件
    • 格式和样式
    • 用`tomlkit` 从头开始创建 TOML
  • 更新现有的TOML文件
    • 将 TOML 表示为 tomlkit 对象
    • 无损读取和写入 TOML
  • 总结

在这里插入图片描述

Python 和 TOML:新最好的朋友

原文:《Python and TOML: New Best Friends》

使用Python加载TOML

使用tomlitomlib加载TOML文档。

使用tomli 或 tomllib 读取TOML文档

在python3.11中,TOML支持已经内置在标准库中,tomllib模块可以读取和解析TOML文档。
如果你使用的是Python3.11及以后的版本,可以直接使用tomllib模块 替代tomli

我们先创建一个TOML文件tic_tac_toe.toml

# tic_tac_toe.toml

[user]
player_x.color = "blue"
player_o.color = "green"

[constant]
board_size = 3

[server]
url = "https://tictactoe.example.com"

用 pip 安装 tomli

python -m pip install tomli

tomli 模块仅公开两个函数:

  • load() :从文件对象加载 TOML
  • loads() :从字符串加载 TOML 文档。

首先用load()函数加载TOML文件:

import tomli
with open("tic_tac_toe.toml", mode="rb") as fp:
    config = tomli.load(fp)

然后可以查看config的内容:

>>> config
{'user': {'player_x': {'color': 'blue'}, 'player_o': {'color': 'green'}},
 'constant': {'board_size': 3},
 'server': {'url': 'https://tictactoe.example.com'}}

>>> config["user"]["player_o"]
{'color': 'green'}

>>> config["server"]["url"]
'https://tictactoe.example.com'

TOML 文档在 Python 中表示为字典。TOML 文件中的所有表和子表都显示为嵌套字典

如果已经将 TOML 文档表示为字符串,则可以使用 loads()代替 load()

>>> import tomli
>>> toml_str = """
... offset_date-time_utc = 2021-01-12 00:23:45Z
... potpourri = ["flower", 1749, { symbol = "X", color = "blue" }, 1994-02-14]
... """

>>> tomli.loads(toml_str)
{'offset_date-time_utc': datetime.datetime(2021, 1, 12, 0, 23, 45,
                                           tzinfo=datetime.timezone.utc),
 'potpourri': ['flower',
               1749,
               {'symbol': 'X', 'color': 'blue'},
               datetime.date(1994, 2, 14)]}

注意,TOML 时间和日期类型由 Python datetime 的类型表示

load()loads()之间的一个区别是,当您使用loads()时,您使用的是常规字符串而不是字节。在这种情况下, tomli 假设您已正确处理编码。

如果你希望自动设置tomli和tomllib。如果Python版本是3.11及以后的版本,则直接使用tomllib模块,否则安装并使用tomli模块。
requirements.txt写入:

tomli >= 1.1.0 ; python_version < "3.11"

在导入模块时:

try:
    import tomllib
except ModuleNotFoundError:
    import tomli as tomllib

比较TOML类型和Python类型

  • TOML 文件必须是有效的 UTF-8 编码的 Unicode 文档。
  • 任意 64 位有符号整数(从 −2^63 到 2^63−1)应被接受并无损处理。
  • 浮点数应实现为 IEEE 754 binary64 值。

一般来说,TOML的需求与Python对相应类型的实现非常匹配。Python 在处理文件时通常默认使用 UTF-8,而 Python float 遵循 IEEE 754。Python 的 int 类实现了任意精度的整数,这些整数可以处理所需的范围和更大的数字。

对于像 和 tomllib 这样的 tomli 基本库,TOML 的数据类型和 Python 的数据类型之间的映射是很自然的。您可以在tomllib 文档中找到以下转换表:

TOMLPython
stringstr
integerint
floatfloat
booleanbool
tabledict
offset date-timedatetime.datetime (.tzinfo是datetime.timezone是实例)
local date-timedatetime.datetime(.tzinfo是None)
local datedatetime.date
local timedatetime.time
arraylist

load()loads() 函数有一个参数 parse_float ,指定应如何分析浮点数。

默认实现满足使用 64 位浮点数的要求,通常精确到大约 16 位有效数字。大部分情况下这个精度足够了,但是如果您需要更高的精度,您可以使用 Decimal 类型。

>>> import tomli
>>> from decimal import Decimal
>>> ts = tomli.loads(
...     "ts = 2_459_772.084027777777778",
...     parse_float=Decimal,
... )["ts"]
>>> ts
Decimal('2459772.084027777777778')

>>> seconds = (ts - int(ts)) * 86_400
>>> seconds
Decimal('7260.000000000019200')

>>> seconds - 7260
Decimal('1.9200E-11')

在项目中使用配置文件

我们希望配置文件只读取一次,然后各个地方的代码都可以使用这个配置。

实际上,Python的import机制可以帮助我们实现这一点。import模块时,会缓存模块的内容,所以只有第一次import时会读取配置文件。

下面看一个具体的例子。
我们的配置文件为tic_tac_toe.toml

# tic_tac_toe.toml

[user]
player_x.color = "blue"
player_o.color = "green"

[constant]
board_size = 3

[server]
url = "https://tictactoe.example.com"

创建config/目录:

config/
├── __init__.py
└── tic_tac_toe.toml

名为 __init__.py 的文件在 Python 中扮演着特殊的角色。它们将包含目录标记为包。此外, __init__.py 定义的名称通过包公开。

下面我们在__init__.py读取配置文件:

# __init__.py

import pathlib
import tomli

path = pathlib.Path(__file__).parent / "tic_tac_toe.toml"
with path.open(mode="rb") as fp:
    tic_tac_toe = tomli.load(fp)

在config目录下启动解释器:

>>> import config
>>> config.path
PosixPath('/home/realpython/config/tic_tac_toe.toml')

>>> config.tic_tac_toe
{'user': {'player_x': {'color': 'blue'}, 'player_o': {'color': 'green'}},
 'constant': {'board_size': 3},
 'server': {'url': 'https://tictactoe.example.com'}}

现在,您可以通过将 config/ 目录复制到项目中并将井字游戏配置替换为您自己的设置,将配置集成到现有项目中。
在代码文件中,您可能希望为配置导入添加别名,以便更方便地访问您的设置:

>>> from config import tic_tac_toe as CFG

>>> CFG["user"]["player_x"]["color"]
'blue'

将Python对象转换为TOML

TOML 文档通常是手写的,因为它们主要用作配置。不过,有时您可能需要将嵌套字典转换为 TOML 文档。

将字典转换为 TOML

{
    "user": {
        "player_x": {"symbol": "X", "color": "blue", "ai": True},
        "player_o": {"symbol": "O", "color": "green", "ai": False},
        "ai_skill": 0.85,
    },
    "board_size": 3,
    "server": {"url": "https://tictactoe.example.com"},
}

在本小节中,您将编写一个简化的 TOML 编写器,该编写器能够将此字典编写为 TOML 文档。

创建一个新文件to_toml.py
首先,编写一个名为_dumps_value() 的辅助函数。此函数将获取某个值,并根据值类型返回其 TOML 表示形式。

# to_toml.py

def _dumps_value(value):
    if isinstance(value, bool):
        return "true" if value else "false"
    elif isinstance(value, (int, float)):
        return str(value)
    elif isinstance(value, str):
        return f'"{value}"'
    elif isinstance(value, list):
        return f"[{', '.join(_dumps_value(v) for v in value)}]"
    else:
        raise TypeError(f"{type(value).__name__} {value!r} is not supported")

接下来,您将添加处理表的代码。main 函数遍历字典,并将每个项目转换为键值对。如果该值恰好是字典,则您将添加一个表头并递归填写该表:

# to_toml.py

# ...

def dumps(toml_dict, table=""):
    toml = []
    for key, value in toml_dict.items():
        if isinstance(value, dict):
            table_key = f"{table}.{key}" if table else key
            toml.append(f"\n[{table_key}]\n{dumps(value, table_key)}")
        else:
            toml.append(f"{key} = {_dumps_value(value)}")
    return "\n".join(toml)

这在处理嵌套时会出现顺序问题,我们进行排序来修复这个问题。

# to_toml.py

# ...

def dumps(toml_dict, table=""):
    def tables_at_end(item):
        _, value = item
        return isinstance(value, dict)

    toml = []
    for key, value in sorted(toml_dict.items(), key=tables_at_end):
        if isinstance(value, dict):
            table_key = f"{table}.{key}" if table else key
            toml.append(f"\n[{table_key}]\n{dumps(value, table_key)}")
        else:
            toml.append(f"{key} = {_dumps_value(value)}")
    return "\n".join(toml)

通过tomli_w 写TOML文档

tomli_w有两个函数: dump()dumps()

类似于tomliload()loads()dump()写入文件,dumps()写入字符串。

Python 3.11 中的新 tomllib 库不包括 dump() 和 dumps()

需要安装tomli_w

python -m pip install tomli_w

现在我们可以容易地将字典导出为TOML文档。

>>> import tomli_w
>>> config = {
...     "user": {
...         "player_x": {"symbol": "X", "color": "blue", "ai": True},
...         "player_o": {"symbol": "O", "color": "green", "ai": False},
...         "ai_skill": 0.85,
...     },
...     "board_size": 3,
...     "server": {"url": "https://tictactoe.example.com"},
... }

>>> print(tomli_w.dumps(config))
board_size = 3

[user]
ai_skill = 0.85

[user.player_x]
symbol = "X"
color = "blue"
ai = true

[user.player_o]
symbol = "O"
color = "green"
ai = false

[server]
url = "https://tictactoe.example.com"

可以使用 dump() 将配置写入文件:

>>> with open("tic-tac-toe-config.toml", mode="wb") as fp:
...     tomli_w.dump(config, fp)
...

创建新的TOML文件

在本节中,您将首先探索如何设置 TOML 文档的格式,以使其更易于用户使用。然后,您将尝试另一个名为 tomlkit 的库,您可以使用它来完全控制 TOML 文档。

格式和样式

通常,TOML 文件中会忽略空格。您可以利用这一点使配置文件井井有条、可读且直观。
此外, # 符号将该行的其余部分标记为注释。

从某种意义上说,TOML 文档没有样式指南,因为 PEP 8 是 Python 代码的样式指南。但是,该规范确实包含一些建议,同时保留了一些样式方面供您选择。

为了保持一致性,您可以在项目中使用像 Taplo 这样的格式化程序,并将其配置文件包含在版本控制中。您也可以将其集成到编辑器中。

tomlkit 从头开始创建 TOML

TOML Kit 最初是为 Poetry 项目构建的。作为依赖项管理的一部分,Poetry 会操作 pyproject.toml 该文件。但是,由于此文件用于多种用途,因此 Poetry 必须保留文件中的样式和注释。

首先通过pip安装tomlkit:
python -m pip install tomlkit

然后,我们确认tomlkit可以保留样式和注释:

>>> import tomlkit
>>> toml_data = """
... [nested]  # Not necessary
...
...     [nested.table]
...     string       = "Hello, TOML!"
...     weird_string = '''Literal
...         Multiline'''
... """
>>> print(tomlkit.dumps(tomlkit.loads(toml_data)))

[nested]  # Not necessary

    [nested.table]
    string       = "Hello, TOML!"
    weird_string = '''Literal
        Multiline'''

>>> tomlkit.dumps(tomlkit.loads(toml_data)) == toml_data
True

下面我们使用tomlkit创建一个新的TOML文件:

>>> from tomlkit import comment, document, nl, table

>>> toml = document()
>>> toml.add(comment("Written by TOML Kit"))
>>> toml.add(nl())
>>> toml.add("board_size", 3)

调用 document()创建一个 TOML 文档实例。然后,您可以使用 .add() 向此文档添加不同的对象,例如注释、换行符、键值对和表。

您可以使用 dump()dumps() 如上所述 toml 转换为实际的 TOML 文档,也可以使用.as_string() 方法:

>>> print(toml.as_string())
# Written by TOML Kit

board_size = 3

通过添加几个表来继续您的示例:

>>> player_x = table()
>>> player_x.add("symbol", "X")
>>> player_x.add("color", "blue")
>>> player_x.comment("Start player")
>>> toml.add("player_x", player_x)

>>> player_o = table()
>>> player_o.update({"symbol": "O", "color": "green"})
>>> toml["player_o"] = player_o

您可以通过调用 table()创建表并向其添加内容。
可以通过.add()添加键和值,也可以使用 .update() 直接从字典添加键和值。

更新现有的TOML文件

将 TOML 表示为 tomlkit 对象

下面仔细研究一下如何用ttomlki表示 TOML 文档。

首先,创建tic-tac-toe-config.toml :

# tic-tac-toe-config.toml

board_size = 3

[user]
ai_skill = 0.85  # A number between 0 (random) and 1 (expert)

    [user.player_x]
    symbol = "X"
    color = "blue"
    ai = true

    [user.player_o]
    symbol = "O"
    color = "green"
    ai = false

# Settings used when deploying the application
[server]
url = "https://tictactoe.example.com"

打开 REPL 会话并使用以下命令 tomlkit 加载此文档:

>>> import tomlkit
>>> with open("tic-tac-toe-config.toml", mode="rt", encoding="utf-8") as fp:
...     config = tomlkit.load(fp)
...
>>> config
{'board_size': 3, 'user': {'ai_skill': 0.85, 'player_x': { ... }}}

>>> type(config)
<class 'tomlkit.toml_document.TOMLDocument'>

load() 用于从文件加载 TOML 文档。 config 看起来像一个字典。然而,深入挖掘,你会发现它是TOMLDocument 类型。

我们可以用[]访问:

>>> config["user"]["player_o"]["color"]
'green'

>>> type(config["user"]["player_o"]["color"])
<class 'tomlkit.items.String'>

>>> config["user"]["player_o"]["color"].upper()
'GREEN'

发现其中的值也是特殊的tomlkit数据类型。不过我们可以像普通的Python对象一样使用它们。例如,可以使用 .upper() 字符串方法。

特殊数据类型的一个优点是,它们允许您访问有关文档的元信息,包括注释和缩进:

>>> config["user"]["ai_skill"]
0.85

>>> config["user"]["ai_skill"].trivia.comment
'# A number between 0 (random) and 1 (expert)'

>>> config["user"]["player_x"].trivia.indent
'    '

如上所述,您通常可以将这些特殊对象视为原生 Python 对象。事实上,它们继承自相应的Python对象。但是,如果你真的需要,你可以用 .unwrap() 它们转换为普通的 Python:

>>> config["board_size"] ** 2
9

>>> isinstance(config["board_size"], int)
True

>>> config["board_size"].unwrap()
3

>>> type(config["board_size"].unwrap())
<class 'int'>

无损读取和写入 TOML

在本小节中,您将加载现有的 TOML 文件,并在将其写回磁盘之前对其进行一些更改。

首先加载您在上一小节中使用的相同 TOML 文件:

>>> import tomlkit
>>> with open("tic-tac-toe-config.toml", mode="rt", encoding="utf-8") as fp:
...     config = tomlkit.load(fp)
...

现在,你可以用.add()添加新元素,但无法用.add()更新现有key的值。

>>> config.add("app_name", "Tic-Tac-Toe")
{'board_size': 3, 'app_name': 'Tic-Tac-Toe', 'user': { ... }}

>>> config["user"].add("ai_skill", 0.6)
Traceback (most recent call last):
  ...
KeyAlreadyPresent: Key "ai_skill" already exists.

不过,我们可以像字典一样:

>>> config["user"]["ai_skill"] = 0.6
>>> print(config["user"].as_string())
ai_skill = 0.6  # A number between 0 (random) and 1 (expert)

    [user.player_x]
    symbol = "X"
    color = "blue"
    ai = true

    [user.player_o]
    symbol = "O"
    color = "green"
    ai = false

当您更新这样的值时, tomlkit 仍然会保留样式和注释。如您所见,关于 ai_skill 的注释保持不变。

部分 tomlkit 支持所谓的 Fluent 接口(链式调用)。在实践中,这意味着返回更新的对象

>>> from tomlkit import aot, comment, inline_table, nl, table
>>> player_data = [
...     {"user": "gah", "first_name": "Geir Arne", "last_name": "Hjelle"},
...     {"user": "tompw", "first_name": "Tom", "last_name": "Preston-Werner"},
... ]

>>> players = aot()
>>> for player in player_data:
...     players.append(
...         table()
...         .add("username", player["user"])
...         .add("name",
...             inline_table()
...             .add("first", player["first_name"])
...             .add("last", player["last_name"])
...         )
...     )
...
>>> config.add(nl()).add(comment("Players")).add("players", players)

完成对配置的更新后,现在可以将其写回同一文件:

>>> with open("tic-tac-toe-config.toml", mode="wt", encoding="utf-8") as fp:
...     tomlkit.dump(config, fp)

打开 tic-tac-toe-config.toml 并注意您的更新已包含在内。同时,保留了原有的风格。

总结

现在你已经了解TOML语法以及在Python中使用它的方式。当你需要一个配置文件时,推荐考虑使用TOML

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建springboot 2.x web空项目(IDEA)

由于学习时候发现spring官网只能创建springboot3.0的项目&#xff0c;而且不支持java1.8&#xff0c;无法选择java8作为java版本&#xff0c;导致很多教程无法跟着做&#xff0c;因此记录一下可行的创建过程。 &#xff08;Tips:当前spring Initializr不支持java8的解决方式&a…

在win11关闭copilot

在设置中的个性化设置&#xff0c;任务栏处关闭即可。 参考资料 How to disable Copilot in Windows 11

6种最佳的UI设计工具!

最好的UI设计工具可以适应几乎每一个设计过程&#xff0c;并有望满足您的创意需求。UI设计工具为设计师提供了高保真线框图、物理模型和原型所需的精确设计&#xff0c;并提供了最小限度的可行性产品。它们代表设计细节&#xff0c;传达设计功能。用户体验设计工具关注用户&…

C++作业day2

封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostre…

BM1684X搭建sophon c++环境

1:首先安装编译好sophon-sail 比特大陆BM1684X开发环境搭建--SOC mode-CSDN博客 2:在将之前配置的soc-sdk拷贝一份到sdk根目录&#xff0c;将交叉编译好的sail中的build_soc拷贝至soc-sdk文件夹内&#xff1b; cp -rf build_soc/sophon-sail/inlcude soc-sdk cp -rf build_soc…

测试用例实战(全网最详细-注册,登录,发布文章)

1.注册测试用例实战 需求图片如下&#xff1a; 注册测试点&#xff08;用等价类和边界值&#xff09; 重点提示&#xff1a; 正向&#xff1a;⼀次尽量覆盖多条 逆向&#xff1a;⼀次只能覆盖⼀条&#xff0c;其他选项必须正确。 注册测试用例 注意&#xff1a;注册的测试点…

Linux:深入文件系统

一、Inode 我们使用ls -l的时候看到的除了看到文件名&#xff0c;还看到了文件元数据。 [rootlocalhost linux]# ls -l 总用量 12 -rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out -rw-r--r--. 1 root root 654 "9月 13 14:56" test.c 每行包含7列&…

一文弄懂空间金字塔池化网络

目录 空间金字塔池化网络是什么&#xff1f; 组成部分和工作原理 具体步骤 ​编辑 主要优点 空间金字塔池化网络是什么&#xff1f; 空间金字塔池化网络&#xff08;Spatial Pyramid Pooling Network&#xff0c;SPPNet&#xff09;是一种用于处理具有不同尺寸和比例的输入…

选股就用河北源达“财源滚滚”选股软件

在股市投资的道路上&#xff0c;选股无疑是至关重要的一环。然而&#xff0c;面对海量的个股信息和复杂的市场环境&#xff0c;如何科学、准确地选股&#xff0c;成为了投资者必须面对的难题。河北源达信息技术股份有限公司推出的“财源滚滚”选股软件&#xff0c;以其独特的优…

Kotlin 数据解析(Gson)

一、添加依赖 build.gradle.kts(:app) // gson数据解析implementation("com.google.code.gson:gson:2.8.6") 对象类&#xff1a; // 对象类 class Account {var uid:String "00001"var userName:String "Freeman"var password:String &quo…

使用IDEA构建SpringBoot程序的镜像

实战&#xff1a;使用IDEA构建SpringBoot程序的镜像 这里就以我之前写的WIT问卷管理系统为例子吧。 首先在之前写好的SpringBoot项目中新建一个DockerFile 在Dockerfile中写入我们的base镜像&#xff0c;之前我已经创建好了并且传到docker仓库了&#xff0c;这里就直接拉取 …

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

yolo发展历史

yolo系列 一、任务描述二、设计思想三、发展历程1. YOLOv11.1问题背景1.2创新点1.3训练流程1.4检测流程1.4.1 优点1.4.2 缺点 2. YOLOv22.1问题背景2.2创新点2.3提升性能的方法2.4训练流程&#xff1f;&#xff1f;&#xff1f;&#xff1f; 3. YOLOv33.1问题背景3.2模型改进 4…

MySQL学习Day31-主从复制

一、主从复制概述: 主从复制作用1:读写分离&#xff0c;可以通过主从复制的方式来同步数据&#xff0c;然后通过读写分离提高数据库并发处理能力;其中一个是Master主库&#xff0c;负责写入数据;其它都是slave从库&#xff0c;负责读取数据。当主库进行更新的时候&#xff0c;…

相机安装位置固定后开始调试设备供电公司推荐使用方法

摄像头安装位置固定后开始调试 设备供电&#xff1a;无电源设备需要连接12V/2A电源并连接到摄像机的DC端口&#xff0c;而有电源的摄像机可以直接连接到220V电源。 连接设备&#xff1a;如果是有线连接&#xff0c;请使用网线将设备连接到电脑&#xff08;建议直接连接&#…

Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人

今天我们来重点研究与实测一个开源的Text2SQL优化框架 – Vanna 1. Vanna 简介【Text-to-SQL 工具】 Vanna 是一个基于 MIT 许可的开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关功能。它允许用户在数据上训练一个 RAG “模型”&a…

PLC数采网关在实际应用中的效能-天拓四方

在工业自动化领域中&#xff0c;PLC扮演着至关重要的角色&#xff0c;它负责控制和监测生产线的各个环节。然而&#xff0c;随着工业4.0的推进和智能制造的快速发展&#xff0c;单纯依靠PLC进行现场控制已无法满足企业对数据集中管理、远程监控和智能分析的需求。因此&#xff…

立即注册 | 线上讲座:借助 NGINX Plus 优化物联网数据传输和应用安全

原文作者&#xff1a;NGINX 原文链接&#xff1a;立即注册 | 线上讲座&#xff1a;借助 NGINX Plus 优化物联网数据传输和应用安全 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 基本信息 课程主题 借助 NGINX Plus 优化物联网…

地理数据 vs. 3D数据

在表示我们周围的物理世界时&#xff0c;地理空间数据和 3D 建筑数据是两个最常见的选择。 他们在各个行业和项目中发挥着至关重要的作用。 从构建数字孪生到可视化城市景观和创建沉浸式应用程序。 尽管地理空间和 3D 建筑数据有相似之处&#xff0c;但它们不可互换。 虽然地…

专升本 C语言笔记-05 常量定义 #define宏定义 const关键字 enum关键字

1.宏定义 #define的使用 1.1.宏定义的概念 宏定义就是用一个标识符来表示一个字符串,如果后面代码出现了该标识符,那么就全部替换成指定的字符串 1.2.宏定义实现案例 #include <stdio.h> #define N 123 int main() {printf("N %d\n",N);printf("N N…