对于一堂课,我写了一个数值问题的求解器.我的代码运行在一个IPython笔记本中,其中大部分代码都是纯Python + NumPy + matplotlib,但性能关键部分是用Cython编写的(并包含在IPython %%cython魔法中).教授喜欢我的解决方案,并要求我向一些本科学生提供,他将在另一个班级教授类似的主题作为参考资料.问题是,我不确定分发代码的最佳方式是什么.
我的主要问题是,大多数学生可能会运行Windows.在Windows上编译Cython代码是我最后一次做的噩梦,因为你必须与几个不同的C编译器混在一起,直到找到一个有效的编译器.对于想要运行我的笔记本以获得有效的Cython环境的每个学生来说,绝对不能期望它.
我有想法在Windows机器上预编译代码的Cython部分(它不需要由学生更改)并分发pyd文件.所以我的问题是:
我想弃用参数别名click(例如,从下划线切换为破折号)。有一阵子,我希望两个公式都有效,但是FutureWarning在使用待弃用的别名调用参数时抛出一个。但是,我还没有找到访问调用参数的实际别名的方法。
简而言之,我要:
click.command()
click.option('--old', '--new')
def cli(*args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
用选项调用时发出警告--old,而用调用时不发出警告--new。有没有一种干净的方式来做到这一点,而又不过度依赖未记录的行为?
我尝试将回调添加到中click.option,但在解析该选项后似乎会调用该回调,并且参数不包含实际使用哪个别名的信息。一个解决方案可能会过载click.Option,甚至可能是click.Command,但是我不知道实际的解析发生在哪里。
我有一个Snakemake规则,可以处理数据存档,并基本上解压缩其中的数据.档案包含我在规则开始之前知道的不同数量的文件,因此我想利用它并执行类似的操作
rule unpack:
input: '{id}.archive'
output:
lambda wildcards: ARCHIVE_CONTENTS[wildcards.id]
Run Code Online (Sandbox Code Playgroud)
但是我无法使用函数output,并且有充分的理由.但是,我无法想出一个好的替代品.该规则运行起来非常昂贵,所以我不能这样做
rule unpack:
input: '{id}.archive'
output: '{id}/{outfile}'
Run Code Online (Sandbox Code Playgroud)
并为每个存档运行多次规则.另一种选择可能是
rule unpack:
input: '{id}.archive'
output: '{id}/{outfile}'
run:
if os.path.isfile(output[0]):
return
...
Run Code Online (Sandbox Code Playgroud)
但我担心会引入竞争条件.
是否dynamic真的唯一选择标记规则输出?我可以自动为每个存档生成一个单独的规则,但我还没有找到办法.