ホームページ  >  記事  >  バックエンド開発  >  超完成度! Python で構成ファイルを記述する一般的な方法

超完成度! Python で構成ファイルを記述する一般的な方法

王林
王林転載
2023-04-11 22:22:051480ブラウズ

超完成度! Python で構成ファイルを記述する一般的な方法

構成ファイルを記述する理由

この修正ファイルは、settings.py や config.py などの .py ファイルに直接書き込むことができます。同じプロジェクト内にある場合は、インポートを通じてその一部を直接インポートできますが、他の非 Python プラットフォームで構成ファイルを共有する必要がある場合、単一の .py を記述するのは良い選択ではありません。現時点では、これらの固定部分を保存するために共通の構成ファイルの種類を選択する必要があります。現在、一般的に使用されている一般的な構成ファイル形式のタイプには、主に ini、json、toml、yaml、xml などが含まれます。これらのタイプの構成ファイルは、標準ライブラリまたはサードパーティ ライブラリを通じて解析できます。

ini

ini とは Initialize の意味で、初期の頃は Windows 上の設定ファイルの保存形式でした。 ini ファイルの記述方法は理解しやすく、比較的単純なことが多く、通常は次のようなセクション、キー、値で構成されます:

[localdb]
host = 127.0.0.1
user = root
password = 123456
port = 3306
database = mysql

Python 独自の組み込み configparser 標準ライブラリを直接使用できます。 ini ファイルを解析するために使用します。たとえば、上記のコンテンツを db.ini という名前のファイルに保存し、次に read() メソッドを使用して解析および読み取りを行い、最後に items() メソッドを使用して指定されたノードの下にあるすべてのキーと値のペアを取得します。

>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read("/Users/Bobot/db.ini")
['/Users/Bobot/db.ini']
>>> cfg.items("localdb")
[('host', '127.0.0.1'), ('user', 'root'), ('password', '123456'), ('port', '3306'), ('database', 'mysql')]

configparser はデフォルトで値を文字列の形式で提示することに注意してください。そのため、db.ini ファイルに引用符を追加せず、上記のリテラルを直接記述します。

キーと値のペアを取得した後、実際にそれを辞書に直接変換し、コードを単純にするためにパラメーターを解凍しました。

#!pip install pymysql
import pymysql
from configparser import ConfigParser
cfg = ConfigParser()
cfg.read("/Users/Bobot/db.ini")
db_cfg = dict(cfg.items("localdb"))
con = pymysql.connect(**db_cfg)

json

json形式は私たちにとって一般的なファイル形式と言え、インターネット上でよく使われるデータ交換形式でもあります。さらに、json は設定ファイルの一種である場合もあります。

たとえば、npm (Python の pip に似た JavaScript パッケージ管理ツール) と、広く使用されている Microsoft 製の VSCode エディターはすべて、json を使用して構成パラメーターを記述します。

configparser と同様に、Python にも組み込みの json 標準ライブラリがあり、load() メソッドとloads() メソッドを通じてファイルと文字列の json コンテンツをインポートできます。

{
 "localdb":{
 "host": "127.0.0.1",
 "user": "root",
 "password": "123456",
 "port": 3306,
 "database": "mysql"
 }
}

上記の内容を db.json として保存し、読み取って解析します。json ライブラリが json ファイルを読み込むのは比較的シンプルで簡単で、Python 辞書オブジェクトに解析するのも簡単です。

>>> import json
>>> from pprint import pprint
>>>
>>> with open('/Users/Bobot/db.json') as j:
... cfg = json.load(j)['localdb']
...
>>> pprint(cfg)
{'database': 'mysql',
'host': '127.0.0.1',
'password': '123456',
'port': 3306,
'user': 'root'}

json ファイル構成を使用する欠点は、構文標準が厳しく制限されていることです。批判の 1 つは、json タイプの他のスーパーセットが代替として使用されない限り、コメントを書き込むことができないことです (コメントは可能です) VSCode の json パラメータ設定ファイルに書き込むことも代替案の 1 つです); 同時に、ネストが深すぎるという問題があり、簡単にエラーが発生する可能性があるため、長くて複雑なパラメータ設定情報を書き込むのには使用しないでください。

toml

toml 形式 (または tml 形式) は、Github の共同創設者 Tom Preston-Werner によって提案された構成ファイル形式です。 Wikipedia によると、toml は 7 年前の 2013 年 7 月に最初に提案されました。また、いくつかの点で後で説明する yaml ファイルに似ていますが、yaml の仕様を知っていれば、仕様が数十ページにも及ぶ場合 (そうです、それは本当に数十ページあります...)、実際にはそのような複雑な設定ファイルを書きたくないかもしれないので、toml 形式が良い選択です。

toml の形式はおおよそ次のとおりです。

超完成度! Python で構成ファイルを記述する一般的な方法

ここから、toml が前述の ini ファイルに似ていることがわかります。しかし、それはiniよりもはるかに拡張されます。

サンプル画像では、基本的な文字列に加えて、タイムスタンプ、ブール値、配列などがさらにサポートされており、そのスタイルが Python のネイティブの記述に非常に似ていることがわかります。

もちろん、toml 形式の仕様についてはここではあまり紹介しませんが、公式の仕様書は既に翻訳されている方がいますので、興味のある方は直接確認してみてください。

開発者は、Python メソッドに適合する構成ファイル タイプに対応する「ホイール」を作成しました。現在、Github では uiri/toml バージョンに最も多くの星が付いていますが、このバージョンは v0.5 バージョンの toml 仕様にのみ合格しています。 pip コマンド

pip install toml

を使用してインストールできます。このライブラリの解析方法は非常に単純で、json ライブラリの解析方法と似ています。解析にはload()またはloads()を使用し、同様に変換とエクスポートも同様に使用されます。

たとえば、次のコンテンツを config.toml に書き込みます:

[mysql]
host = "127.0.0.1"
user = "root"
port = 3306
database = "test"
 [mysql.parameters]
 pool_size = 5
 charset = "utf8"
 [mysql.fields]
 pandas_cols = [ "id", "name", "age", "date"]

その後、Toml ライブラリのload() メソッドを通じてそれを読み取ることができます:

>>> import toml
>>> import os
>>> from pprint import pprint
>>> cfg = toml.load(os.path.expanduser("~/Desktop/config.toml"))
>>> pprint(cfg)
{'mysql': {'database': 'test',
'fields': {'pandas_cols': ['id', 'name', 'age', 'date']},
'host': '127.0.0.1',
'parameters': {'charset': 'utf8', 'pool_size': 5},
'port': 3306,
'user': 'root'}}

toml ファイルが間接的に辞書型に変換されていることがわかります。もちろん、これは json バージョンの記述方法 (一重引用符を二重引用符に置き換えるだけです) であり、これにより後続の呼び出しやパラメーター転送が容易になります。

yaml

yaml 格式(或 yml 格式)是目前较为流行的一种配置文件,它早在 2001 由一个名为 Clark Evans 的人提出;同时它也是目前被广泛使用的配置文件类型,典型的就是 Docker 容器里的 docker-compose.yml 配置文件,如果经常使用 Docker 进行部署的人对此不会陌生。

yaml 文件的设计从 Python、XML 等地方获取灵感,所以在使用时能很清楚地看到这些部分的影子。

在上一节 toml 内容里我曾提到,yaml 的规范内容可以说是冗长和复杂,足足有80页之多。

超完成度! Python で構成ファイルを記述する一般的な方法

所以感兴趣的朋友可以再自行了解相关用法。

YAML 官方早已经提供了相应的 Python 库进行支持,即 PyYAML;当然也同样需要我们事先进行安装:

pip install pyyaml

同 json 库和 toml 库一样,通过 load() 方法来进行加载。

需要注意的是,使用 load() 方法会存在一定的安全隐患,从思科 Talos 的这份报告中我们可以看到,如果加载了未知或不信任的 yaml 文件,那么有可能会存在被攻击的风险和网络安全隐患,因为它能够直接调用相应的 Python 函数来执行为攻击者所需要的命令,比如说在 yaml 文件中写入这么一段:

# 使用Linux和macOS的朋友不要轻易尝试
!!python/object/apply:os.system ["rm -rf /"]

因此最好是使用 safe_load() 来代替 load() 方法。

这和 Python 内置的 string 标准库中 Template 类的 substitute() 模板方法一样存在着同样的安全隐患,所以使用 safe_substitute() 来替代是一样的道理。

如我们现在将之前的一些配置信息写入 config.yaml 文件中:

mysql:
 host: "127.0.0.1"
 port: 3306
 user: "root"
 password: "123456"
 database: "test"
 parameter:
 pool_size: 5
 charset: "utf8"
 fields:
pandas_cols:
 - id
 - name
 - age
 - date

然后我们通过 safe_load() 方法进行解析:

>>> import os
>>> from pprint import pprint
>>>
>>> with open(os.path.expanduser("~/config.yaml"), "r") as config:
... cfg = yaml.safe_load(config)
...
>>> pprint(cfg)
{'mysql': {'database': 'test',
'fields': {'pandas_cols': ['id', 'name', 'age', 'date']},
'host': '127.0.0.1',
'parameter': {'charset': 'utf8', 'pool_size': 5},
'password': '123456',
'port': 3306,
'user': 'root'}}

可以看到最后结果和前面的 toml 库的解析结果基本一致。

结尾

本文列举了一些主流且常见的配置文件类型及其 Python 的读取方法,可能有的读者会发现当中没有 xml 格式类型的内容。对于 xml 配置文件可能与 Java 系语言打交道的朋友遇见得会多一些,但 xml 文件的可读性实在是让人望而生畏;对 xml 文件不了解的朋友可以使用 Chrome 浏览器随便进入一个网站然后按下 F12 进入开发者后查看那密密麻麻的 html 元素便是 .xml 的缩影。

除了这些主流的配置文件类型之外,像一些 .cfg、.properties 等都可以作为配置文件,甚至和开头提到的那样,你单独用一个 .py 文件来书写各类配置信息作为配置文件进行导入都是没问题,只是在跨语言共享时可能会有些障碍。因此本文就不过多介绍,感兴趣的朋友可以进一步自行了解。

在本文里列举的配置文件类型其复杂性由上到下依次增加:ini

以上が超完成度! Python で構成ファイルを記述する一般的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。