我有一个 conda 环境,我想将其转换为诗歌环境。
我尝试过的是将environment.yamlconda环境的翻译成pyproject.toml诗歌可以读取的文件。这里有步骤:
生成yaml文件
conda env export --from-history > environment.yaml
该--from-history标志仅包含我明确要求的包。这是安装 numpy 后文件的样子。
# environment.yaml
name: C:\Users\EDOCIC\Screepts\My_projects\Tests\conda2poetry\condaenv
channels:
- defaults
dependencies:
- numpy
Run Code Online (Sandbox Code Playgroud)
手动创建pyproject.toml文件environment.yaml。我添加了从conda env export. 这是结果:
# pyproject.toml
[tool.poetry]
name = "conda2poetry"
version = "0.1.0"
description = ""
authors = [""]
[tool.poetry.dependencies]
python = "~3.7"
numpy = "^1.21.5"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)
使用 创建环境poetry init,它将自动读取 toml 文件。
该过程似乎有效,但它是相当手动的并且容易出错。 有没有更好的办法?
我有一个函数可以将一些随机字符串打印到控制台,例如:
from random import choice
def hello():
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
请注意,我的实际功能比这更复杂。随机部分是对数据库的请求,可能成功也可能失败。这意味着我无法初始化种子以获得恒定的结果。
我尝试的是使用省略号,但我还需要添加一个丑陋的注释,以便 doctest 识别它。
def hello():
"""
>>> hello() # doctest: +ELLIPSIS
Hello ...!
"""
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
在这种情况下有更好的策略吗?
例如,如果我可以测试答案是否为Hello Guido!和之间的一个,而不是省略号,那就太好了Hello Raymond!。
这个主题并不新鲜,已经在多个帖子中讨论过(链接位于底部)。然而,我觉得资源分散,并不总是清楚什么是最好的方法。我还想引入一些约束来明确定义我期望的行为。
假设我们有一个包含任意数量的项目和任意深度的嵌套字典:
d = {"a": {"b": {"c" : 0}},
"b": {"c" : 1},
"c": 2}
Run Code Online (Sandbox Code Playgroud)
获取其物品的最佳方式是什么?
这种简单的方法相当麻烦,尤其是当有很多嵌套级别时。
>>> d["a"]["b"]["c"]
0
Run Code Online (Sandbox Code Playgroud)
因此,第一个约束是要获取的项的键必须以元组的形式提供,例如:
key = ("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)
现在的目标是创建一些工作原理如下的函数:
>>> getitem(d, key)
0
Run Code Online (Sandbox Code Playgroud)
这种格式也可以方便地直接应用为__getitem__类的方法。
还有一个限制:我希望该函数在被要求获取不存在的密钥时大声失败。
>>> getitem(d, ("asd",))
...
KeyError: 'asd'
Run Code Online (Sandbox Code Playgroud)
这排除了所有使用项目获取来使字典生动的解决方案。
最后,如果可能,请提供低级代码。如果您知道解决此问题的包,请解释底层机制。
参考