akshare 1.16.52__py3-none-any.whl → 1.16.55__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
akshare/__init__.py CHANGED
@@ -3061,9 +3061,12 @@ amac_manager_cancelled_info # 中国证券投资基金业协会-信息公示-诚
3061
3061
  1.16.50 fix: fix futures_inventory_99 interface
3062
3062
  1.16.51 fix: fix stock_individual_basic_info_xq interface
3063
3063
  1.16.52 fix: fix stock_zh_a_spot_em interface
3064
+ 1.16.53 fix: fix stock_yjbb_em interface
3065
+ 1.16.54 fix: fix stock_zh_a_spot_em interface
3066
+ 1.16.55 fix: fix stock_zh_a_spot_em interface
3064
3067
  """
3065
3068
 
3066
- __version__ = "1.16.52"
3069
+ __version__ = "1.16.55"
3067
3070
  __author__ = "AKFamily"
3068
3071
 
3069
3072
  import sys
@@ -226,6 +226,9 @@ def stock_zh_a_spot_em() -> pd.DataFrame:
226
226
  :return: 实时行情
227
227
  :rtype: pandas.DataFrame
228
228
  """
229
+ import nest_asyncio
230
+
231
+ nest_asyncio.apply()
229
232
  return asyncio.run(stock_zh_a_spot_em_async())
230
233
 
231
234
 
@@ -247,7 +247,7 @@ def stock_sz_a_spot_em() -> pd.DataFrame:
247
247
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
248
248
  "fltt": "2",
249
249
  "invt": "2",
250
- "fid": "f3",
250
+ "fid": "f12",
251
251
  "fs": "m:0 t:6,m:0 t:80",
252
252
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,"
253
253
  "f25,f22,f11,f62,f128,f136,f115,f152",
@@ -356,7 +356,7 @@ def stock_bj_a_spot_em() -> pd.DataFrame:
356
356
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
357
357
  "fltt": "2",
358
358
  "invt": "2",
359
- "fid": "f3",
359
+ "fid": "f12",
360
360
  "fs": "m:0 t:81 s:2048",
361
361
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24"
362
362
  ",f25,f22,f11,f62,f128,f136,f115,f152",
@@ -580,7 +580,7 @@ def stock_cy_a_spot_em() -> pd.DataFrame:
580
580
  "fltt": "2",
581
581
  "invt": "2",
582
582
  "wbp2u": "|0|0|0|web",
583
- "fid": "f3",
583
+ "fid": "f12",
584
584
  "fs": "m:0 t:80",
585
585
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,"
586
586
  "f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
@@ -690,7 +690,7 @@ def stock_kc_a_spot_em() -> pd.DataFrame:
690
690
  "fltt": "2",
691
691
  "invt": "2",
692
692
  "wbp2u": "|0|0|0|web",
693
- "fid": "f3",
693
+ "fid": "f12",
694
694
  "fs": "m:1 t:23",
695
695
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,"
696
696
  "f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
@@ -799,7 +799,7 @@ def stock_zh_b_spot_em() -> pd.DataFrame:
799
799
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
800
800
  "fltt": "2",
801
801
  "invt": "2",
802
- "fid": "f3",
802
+ "fid": "f12",
803
803
  "fs": "m:0 t:7,m:1 t:3",
804
804
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20"
805
805
  ",f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
@@ -1186,7 +1186,7 @@ def stock_hk_spot_em() -> pd.DataFrame:
1186
1186
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
1187
1187
  "fltt": "2",
1188
1188
  "invt": "2",
1189
- "fid": "f3",
1189
+ "fid": "f12",
1190
1190
  "fs": "m:128 t:3,m:128 t:4,m:128 t:1,m:128 t:2",
1191
1191
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,"
1192
1192
  "f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
@@ -1272,7 +1272,7 @@ def stock_hk_main_board_spot_em() -> pd.DataFrame:
1272
1272
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
1273
1273
  "fltt": "2",
1274
1274
  "invt": "2",
1275
- "fid": "f3",
1275
+ "fid": "f12",
1276
1276
  "fs": "m:128 t:3",
1277
1277
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,"
1278
1278
  "f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
@@ -1561,7 +1561,7 @@ def stock_us_spot_em() -> pd.DataFrame:
1561
1561
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
1562
1562
  "fltt": "2",
1563
1563
  "invt": "2",
1564
- "fid": "f3",
1564
+ "fid": "f12",
1565
1565
  "fs": "m:105,m:106,m:107",
1566
1566
  "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,"
1567
1567
  "f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152",
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/11/12 21:27
4
+ Date: 2025/3/20 18:00
5
5
  Desc: 东方财富-数据中心-年报季报
6
6
  东方财富-数据中心-年报季报-业绩快报-业绩报表
7
7
  https://data.eastmoney.com/bbsj/202003/yjbb.html
8
8
  """
9
+
9
10
  import pandas as pd
10
11
  import requests
11
- from tqdm import tqdm
12
+
13
+ from akshare.utils.tqdm import get_tqdm
12
14
 
13
15
 
14
16
  def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
@@ -20,29 +22,36 @@ def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
20
22
  :return: 业绩报表
21
23
  :rtype: pandas.DataFrame
22
24
  """
25
+ import warnings
26
+
27
+ warnings.simplefilter(action="ignore", category=FutureWarning) # 忽略所有
23
28
  url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
24
29
  params = {
25
- 'sortColumns': 'UPDATE_DATE,SECURITY_CODE',
26
- 'sortTypes': '-1,-1',
27
- 'pageSize': '500',
28
- 'pageNumber': '1',
29
- 'reportName': 'RPT_LICO_FN_CPD',
30
- 'columns': 'ALL',
31
- 'filter': f"(REPORTDATE='{'-'.join([date[:4], date[4:6], date[6:]])}')",
30
+ "sortColumns": "UPDATE_DATE,SECURITY_CODE",
31
+ "sortTypes": "-1,-1",
32
+ "pageSize": "500",
33
+ "pageNumber": "1",
34
+ "reportName": "RPT_LICO_FN_CPD",
35
+ "columns": "ALL",
36
+ "filter": f"(REPORTDATE='{'-'.join([date[:4], date[4:6], date[6:]])}')",
32
37
  }
33
38
  r = requests.get(url, params=params)
34
39
  data_json = r.json()
35
40
  page_num = data_json["result"]["pages"]
36
41
  big_df = pd.DataFrame()
42
+ tqdm = get_tqdm()
43
+ big_list = []
37
44
  for page in tqdm(range(1, page_num + 1), leave=False):
38
- params.update({
39
- 'pageNumber': page,
40
- })
45
+ params.update(
46
+ {
47
+ "pageNumber": page,
48
+ }
49
+ )
41
50
  r = requests.get(url, params=params)
42
51
  data_json = r.json()
43
52
  temp_df = pd.DataFrame(data_json["result"]["data"])
44
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
45
-
53
+ big_list.append(temp_df)
54
+ big_df = pd.concat(big_list, ignore_index=True)
46
55
  big_df.reset_index(inplace=True)
47
56
  big_df["index"] = range(1, len(big_df) + 1)
48
57
  big_df.columns = [
@@ -57,15 +66,15 @@ def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
57
66
  "_",
58
67
  "每股收益",
59
68
  "_",
60
- "营业收入-营业收入",
69
+ "营业总收入-营业总收入",
61
70
  "净利润-净利润",
62
71
  "净资产收益率",
63
- "营业收入-同比增长",
72
+ "营业总收入-同比增长",
64
73
  "净利润-同比增长",
65
74
  "每股净资产",
66
75
  "每股经营现金流量",
67
76
  "销售毛利率",
68
- "营业收入-季度环比增长",
77
+ "营业总收入-季度环比增长",
69
78
  "净利润-季度环比增长",
70
79
  "_",
71
80
  "_",
@@ -81,6 +90,9 @@ def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
81
90
  "_",
82
91
  "_",
83
92
  "_",
93
+ "_",
94
+ "_",
95
+ "_",
84
96
  ]
85
97
  big_df = big_df[
86
98
  [
@@ -88,9 +100,9 @@ def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
88
100
  "股票代码",
89
101
  "股票简称",
90
102
  "每股收益",
91
- "营业收入-营业收入",
92
- "营业收入-同比增长",
93
- "营业收入-季度环比增长",
103
+ "营业总收入-营业总收入",
104
+ "营业总收入-同比增长",
105
+ "营业总收入-季度环比增长",
94
106
  "净利润-净利润",
95
107
  "净利润-同比增长",
96
108
  "净利润-季度环比增长",
@@ -102,18 +114,32 @@ def stock_yjbb_em(date: str = "20200331") -> pd.DataFrame:
102
114
  "最新公告日期",
103
115
  ]
104
116
  ]
105
- big_df['每股收益'] = pd.to_numeric(big_df['每股收益'], errors="coerce")
106
- big_df['营业收入-营业收入'] = pd.to_numeric(big_df['营业收入-营业收入'], errors="coerce")
107
- big_df['营业收入-同比增长'] = pd.to_numeric(big_df['营业收入-同比增长'], errors="coerce")
108
- big_df['营业收入-季度环比增长'] = pd.to_numeric(big_df['营业收入-季度环比增长'], errors="coerce")
109
- big_df['净利润-净利润'] = pd.to_numeric(big_df['净利润-净利润'], errors="coerce")
110
- big_df['净利润-同比增长'] = pd.to_numeric(big_df['净利润-同比增长'], errors="coerce")
111
- big_df['净利润-季度环比增长'] = pd.to_numeric(big_df['净利润-季度环比增长'], errors="coerce")
112
- big_df['每股净资产'] = pd.to_numeric(big_df['每股净资产'], errors="coerce")
113
- big_df['净资产收益率'] = pd.to_numeric(big_df['净资产收益率'], errors="coerce")
114
- big_df['每股经营现金流量'] = pd.to_numeric(big_df['每股经营现金流量'], errors="coerce")
115
- big_df['销售毛利率'] = pd.to_numeric(big_df['销售毛利率'], errors="coerce")
116
- big_df['最新公告日期'] = pd.to_datetime(big_df['最新公告日期']).dt.date
117
+ big_df["每股收益"] = pd.to_numeric(big_df["每股收益"], errors="coerce")
118
+ big_df["营业总收入-营业总收入"] = pd.to_numeric(
119
+ big_df["营业总收入-营业总收入"], errors="coerce"
120
+ )
121
+ big_df["营业总收入-同比增长"] = pd.to_numeric(
122
+ big_df["营业总收入-同比增长"], errors="coerce"
123
+ )
124
+ big_df["营业总收入-季度环比增长"] = pd.to_numeric(
125
+ big_df["营业总收入-季度环比增长"], errors="coerce"
126
+ )
127
+ big_df["净利润-净利润"] = pd.to_numeric(big_df["净利润-净利润"], errors="coerce")
128
+ big_df["净利润-同比增长"] = pd.to_numeric(
129
+ big_df["净利润-同比增长"], errors="coerce"
130
+ )
131
+ big_df["净利润-季度环比增长"] = pd.to_numeric(
132
+ big_df["净利润-季度环比增长"], errors="coerce"
133
+ )
134
+ big_df["每股净资产"] = pd.to_numeric(big_df["每股净资产"], errors="coerce")
135
+ big_df["净资产收益率"] = pd.to_numeric(big_df["净资产收益率"], errors="coerce")
136
+ big_df["每股经营现金流量"] = pd.to_numeric(
137
+ big_df["每股经营现金流量"], errors="coerce"
138
+ )
139
+ big_df["销售毛利率"] = pd.to_numeric(big_df["销售毛利率"], errors="coerce")
140
+ big_df["最新公告日期"] = pd.to_datetime(
141
+ big_df["最新公告日期"], errors="coerce"
142
+ ).dt.date
117
143
  return big_df
118
144
 
119
145
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: akshare
3
- Version: 1.16.52
3
+ Version: 1.16.55
4
4
  Summary: AKShare is an elegant and simple financial data interface library for Python, built for human beings!
5
5
  Home-page: https://github.com/akfamily/akshare
6
6
  Author: AKFamily
@@ -31,6 +31,7 @@ Requires-Dist: openpyxl>=3.0.3
31
31
  Requires-Dist: jsonpath>=0.82
32
32
  Requires-Dist: tabulate>=0.8.6
33
33
  Requires-Dist: decorator>=4.4.2
34
+ Requires-Dist: nest_asyncio>=1.6.0
34
35
  Requires-Dist: mini-racer>=0.12.4; platform_system != "Linux"
35
36
  Requires-Dist: py-mini-racer>=0.6.0; platform_system == "Linux"
36
37
  Requires-Dist: akracer[py-mini-racer]>=0.0.13; platform_system == "Linux"
@@ -46,12 +47,13 @@ Dynamic: description-content-type
46
47
  Dynamic: home-page
47
48
  Dynamic: keywords
48
49
  Dynamic: license
50
+ Dynamic: license-file
49
51
  Dynamic: provides-extra
50
52
  Dynamic: requires-dist
51
53
  Dynamic: requires-python
52
54
  Dynamic: summary
53
55
 
54
- **欢迎加入专注于财经数据和量化投资的知识社区,获取《AKShare-财经数据宝典》,其汇集了财经数据的使用经验和指南,还独家分享了
56
+ **欢迎加入专注于财经数据和量化投研的知识社区,获取《财经数据宝典》和《量化投研宝典》,其汇集了财经数据和量化投研的多年经验,还独家分享了
55
57
  众多国内外财经数据源的使用和注意事项,请点击[了解更多](https://akshare.akfamily.xyz/learn.html)**。
56
58
 
57
59
  **量化投研视频课程:《PyBroker-入门及实战》已经上架!《PyBroker-进阶及实战》正在更新!**
@@ -1,4 +1,4 @@
1
- akshare/__init__.py,sha256=YtsChI5u3QR8wkorHgWxtOuZAkSTkIe557ZechkL670,191542
1
+ akshare/__init__.py,sha256=sNChgkHXIPcKriuS95yWSsmW7KFlONxNXo3MLqud6-Y,191675
2
2
  akshare/datasets.py,sha256=rKuRNZrqi6IMsZ9nyvO3Rx02js0tH3zMLjz8HQNAoPQ,963
3
3
  akshare/exceptions.py,sha256=WEJjIhSmJ_xXNW6grwV4nufE_cfmmyuhmueVGiN1VAg,878
4
4
  akshare/request.py,sha256=HtFFf9MhfEibR-ETWe-1Tts6ELU4VKSqA-ghaXjegQM,4252
@@ -289,7 +289,7 @@ akshare/stock/stock_zh_b_sina.py,sha256=-sd0wG4zETsgrJSXivww4YieXfnVMNSfh3phsX_X
289
289
  akshare/stock/stock_zh_kcb_report.py,sha256=7zRovNGqXrPIYtUj9C3ivlYzfiudkaeBNiYPYlzDWkQ,2914
290
290
  akshare/stock/stock_zh_kcb_sina.py,sha256=ZKFoyq9Y-6LhBoYERc4Oqv5q3Llpne7ngDIZcCs8Yq0,9862
291
291
  akshare/stock_a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
- akshare/stock_a/stock_zh_a_spot.py,sha256=sstb_o4KVsSMoZSkLtgyITkssDMfanKPhA-tWCJgf70,6435
292
+ akshare/stock_a/stock_zh_a_spot.py,sha256=9gznZujzJ-awj7p4Ma_n5orGPpvyOc8RmSy695aFca8,6485
293
293
  akshare/stock_feature/__init__.py,sha256=c2VDBGyg8nWZYLvtnnSqUoQ92Cu6dJ7UFOeJsB2Gff8,82
294
294
  akshare/stock_feature/cons.py,sha256=UgwXlae3UpVRuhTt33nP-jmhNyug2mZLzuMgLja6pbA,465
295
295
  akshare/stock_feature/stock_a_below_net_asset_statistics.py,sha256=XrhZI-wLuXXufI5Nh1l9gUx9x7f0iDtdtKa14wexo54,2653
@@ -320,7 +320,7 @@ akshare/stock_feature/stock_gdhs.py,sha256=Z6ZMy1A03BqMu9TghcIu2Sd_wwEtpIH7qawHu
320
320
  akshare/stock_feature/stock_gdzjc_em.py,sha256=SHJH5iS3_NhvjTqRXF0vPooZl0s_ASeyZmNCC50ZYqs,4426
321
321
  akshare/stock_feature/stock_gpzy_em.py,sha256=FgyjVgdoxrtMM7WwxdQJxK0mYGJklIHaT9KmMCFmEPM,17869
322
322
  akshare/stock_feature/stock_gxl_lg.py,sha256=I8TpDEpFzadZSSyZisyIk6163mJlRxup91dmlBH4t4U,2641
323
- akshare/stock_feature/stock_hist_em.py,sha256=vC3gWA1hTgWdwk4VFfk6HOwfWuzlYO2xa5vZg5hi088,64241
323
+ akshare/stock_feature/stock_hist_em.py,sha256=wSQvGjdY508sFXSXSnRidaXNXPZlsKSOHphXUmAK_hw,64249
324
324
  akshare/stock_feature/stock_hist_tx.py,sha256=WpLsbkG2didSx7lYNkSbTWNTrLhUKbcopfD18WO2Rlc,3397
325
325
  akshare/stock_feature/stock_hk_valuation_baidu.py,sha256=_sErx4UhNsSXJgXyPfrL0aPxkW53Mg1zH9gEKoziaCA,1968
326
326
  akshare/stock_feature/stock_hot_xq.py,sha256=NmoH4x-0hiDztj-YwzMFVIyOICQ2wUUBbhjt91q-tq4,9112
@@ -350,7 +350,7 @@ akshare/stock_feature/stock_three_report_em.py,sha256=Menwk2QMf9LDZAHoXTythrzyYI
350
350
  akshare/stock_feature/stock_ttm_lyr.py,sha256=RwKMgI_A3rDRIITd_idmvlFSkn4DTUPNVfPjISSTZYw,1110
351
351
  akshare/stock_feature/stock_value_em.py,sha256=RA842dkeChSEoS3yN9fiGxS3eDzYjeUdrpXbnteyzZY,2576
352
352
  akshare/stock_feature/stock_wencai.py,sha256=KPwt72SOnK4dHh2vpWOHYynkj8Vrbv3AW-EXK7d3NZY,4343
353
- akshare/stock_feature/stock_yjbb_em.py,sha256=J-JFnRy4M1DlM46J2ccJTdnkUrI3M2lTYj4CpzqgADo,4275
353
+ akshare/stock_feature/stock_yjbb_em.py,sha256=hQBr1aj808AdA88Y_dpuR7G1mb487hcRamD31UZus-s,4689
354
354
  akshare/stock_feature/stock_yjyg_cninfo.py,sha256=DveTsc-DhLzRDBJZQ7yv8KogzG-vo3Pmr2oRgCzaH1E,2870
355
355
  akshare/stock_feature/stock_yjyg_em.py,sha256=CnpSNyOUYVzoduFTVwsERtdp_uJimlHddw4uWV0iDmc,12184
356
356
  akshare/stock_feature/stock_yzxdr_em.py,sha256=-16KDPtBDXkbHRs7aNAyPy35XurDj7LIcbWAtmgvP64,3219
@@ -389,10 +389,10 @@ akshare/utils/demjson.py,sha256=xW2z0UGS2zzyH_dzhd765ZveuXRbfjkM7KBiI8H5fJA,2416
389
389
  akshare/utils/func.py,sha256=4cwmXFztU86yJNONJ40KJLvsIEQHBbct4iMm3zT2v30,2315
390
390
  akshare/utils/token_process.py,sha256=K4rGXjh_tgugbRcyOK2h2x0jP3PT65IIK7nxhUKhOeQ,666
391
391
  akshare/utils/tqdm.py,sha256=MuPNwcswkOGjwWQOMWXi9ZvQ_RmW4obCWRj2i7HM7FE,847
392
+ akshare-1.16.55.dist-info/licenses/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
392
393
  tests/__init__.py,sha256=gNzhlO0UPjFq6Ieb38kaVIODXv4cTDByrdohAZnDYt4,82
393
394
  tests/test_func.py,sha256=j1MGYbZI2if2j_LY1S4FLsf4qfq4NwVqD5wmRlv5Log,832
394
- akshare-1.16.52.dist-info/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
395
- akshare-1.16.52.dist-info/METADATA,sha256=59pYgCLbDojWZPVz86zWq_pt4NTH58dqhR5K84elVGs,13685
396
- akshare-1.16.52.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
397
- akshare-1.16.52.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
398
- akshare-1.16.52.dist-info/RECORD,,
395
+ akshare-1.16.55.dist-info/METADATA,sha256=xiYUO8A4mokQW0CrUEx2pYlEJYF4AthRzBxlnzaZKko,13767
396
+ akshare-1.16.55.dist-info/WHEEL,sha256=tTnHoFhvKQHCh4jz3yCn0WPTYIy7wXx3CJtJ7SJGV7c,91
397
+ akshare-1.16.55.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
398
+ akshare-1.16.55.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.1.0)
2
+ Generator: setuptools (77.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5