python - 摄入量:目录级参数
问题描述
我在这里阅读“参数” ,想知道我是否可以定义目录级别的参数,以便以后在目录源的定义中使用?
考虑一个简单的 YAML 目录,它有两个来源:
sources:
data1:
args:
urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv"
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
data2:
args:
urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv"
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
请注意,两个数据源(data1 和 data2)都使用snapshot_date
参数内的urlpath
参数?有了这个定义,我可以加载数据源:
cat = intake.open_catalog("./catalog.yaml")
cat.data1(snapshot_date="latest").read() # reads from data/latest/data1.csv
cat.data2(snapshot_date="20211029").read() # reads from data/20211029/data2.csv
请注意,这cat.data1().read()
不起作用,因为snapshot_date
默认为空字符串,因此 csv 驱动程序找不到路径“./data//data1.csv”。
我可以通过向每个(!)源添加部分来设置默认值,parameters
如下所示。
sources:
data1:
parameters:
snapshot_date:
type: str
default: "latest"
description: ""
args:
urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv"
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
data2:
parameters:
snapshot_date:
type: str
default: "latest"
description: ""
args:
urlpath: "{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv"
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
但这看起来很复杂(太多重复的代码)并且对最终用户来说有点不方便——如果用户想要从给定日期加载所有数据源,他必须snapshot_date
在初始化时显式地为每个(!)数据源提供参数。IMO,如果我用户可以在初始化目录时提供一次这个值,那就太好了。
有没有办法可以snapshot_date
在目录级别定义参数?以便:
- 我可以在目录参数的 YAML 定义中设置默认值(例如,在我的示例中为“最新”)
- 或者可以在调用期间在运行时传递目录的参数值
intake.open_catalog("./catalog.yaml", snapshot_date="20211029")
- 在该目录的数据源定义中应该可以访问该值吗?
cat = intake.open_catalog("./catalog.yaml", snapshot_date="20211029")
cat.data1.read() # will return data from ./data/20211029/data1.csv
cat.data2.read() # will return data from ./data/20211029/data2.csv
cat.data2(snapshot_date="latest").read() # will return data from ./data/latest/data1.csv
cat = intake.open_catalog("./catalog.yaml")
cat.data1.read() # will return data from ./data/latest/data1.csv
cat.data2.read() # will return data from ./data/latest/data2.csv
提前致谢
解决方案
这个想法之前已经提出过(https://github.com/intake/intake/pull/562,https://github.com/intake/intake/issues/511),我有一个暗示可能是https:// /github.com/zillow/intake-nested-yaml-catalog支持您所要求的内容。
但是,我完全支持在 Intake 中添加此功能,无论是基于 #562,上面还是其他。将它添加到基本目录和 YAML 文件目录应该很容易,但要让它适用于所有子类可能会很棘手。
目前,您可以使用环境变量来实现您想要的,例如“{{snapshot_date}}”->“{{env(SNAPSHOT_DATE)}}”,但您需要与用户沟通应该设置此变量。此外,如果该值不在字符串中使用,您仍需要一个参数定义来强制转换为正确的类型。
推荐阅读
- c# - 启动在另一个项目时Controller找不到视图
- python - 可以使用 gensim Doc2Vec 将新文档与训练模型进行比较吗?
- sql - 工作日聚合的星期函数
- ckeditor - ckeditor balloonpanel在滚动时没有保持附着在元素上
- python - 如何在 Python 的 nlopt 中返回增强拉格朗日方法 (LD_AUGLAG) 的拉格朗日乘数和惩罚参数的最终值?
- flutter - 当我不想使用堆栈设置背景图像时,是否有任何解决方案可以将背景图像设置为脚手架?
- visual-studio - Visual Studio 中的即时窗口在运行时消失
- python - 将长文件拆分为 8 个相等的文件
- javascript - Angular 6 错误 TS8011 类型参数只能在 .ts 文件中使用
- python - 为 SQL 语句准备 Python 元组