我正在阅读"参数"在这里,想知道我是否可以定义目录级别参数,以便稍后在目录源的定义中使用?
考虑一个具有两个源的简单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)在urlpath
参数内使用snapshot_date
参数?有了这个定义,我可以用以下方式加载数据源:
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
参数。在我看来,如果用户可以在初始化目录时提供这个值,那就太好了。
是否有一种方法可以在目录级别定义snapshot_date
参数?所以:
- 我可以设置默认值(例如"latest")在我的例子中)目录参数 的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
Thanks in advance
这个想法以前已经提出过(https://github.com/intake/intake/pull/562, https://github.com/intake/intake/issues/511),我有一个暗示,也许https://github.com/zillow/intake-nested-yaml-catalog支持像你问的东西。
然而,我完全支持在摄入量中添加这个功能,无论是基于上面的#562,还是其他。将它添加到基本目录和YAML文件目录中应该很容易,但是要使它适用于所有子类可能会很棘手。
目前,您可以使用环境变量实现您想要的,例如,"{{snapshot_date}}"->"{{env(snapshot_date)}}",但您需要与用户沟通,应该设置该变量。此外,如果值不在字符串中使用,您仍然需要一个形参定义来转换为正确的类型。
这是一个hack,但是考虑一个yaml
文件的内容:
global_params:
snapshot_date: &global
default: latest
description: ''
type: str
sources:
data1:
args:
urlpath: '{{CATALOG_DIR}}/data/{{snapshot_date}}/data1.csv'
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
parameters:
snapshot_date: *global
data2:
args:
urlpath: '{{CATALOG_DIR}}/data/{{snapshot_date}}/data2.csv'
description: ''
driver: intake.source.csv.CSVSource
metadata: {}
parameters:
snapshot_date: *global
现在intake
将接受snapshot_date
对特定源的关键字参数。
相关答案:1和2。