标签: idioms

在 Python 中处理灵活的函数参数

TL;TR 寻找习语和模式,根据简单的规范(例如名称列表)将位置参数和关键字参数解压缩为位置参数的有序序列。这个想法看起来类似于类似 scanf 的解析。

我正在包装一个名为 的 Python 模块的函数someapi。的函数someapi只需要位置参数,在大多数情况下这是痛苦的数字。我想让调用者能够灵活地向我的包装器传递参数。以下是我想要允许的包装器调用的示例:

# foo calls someapi.foo()
foo(1, 2, 3, 4)
foo(1, 2, 3, 4, 5) # but forward only 1st 4 to someapi.foo
foo([1, 2, 3, 4])
foo([1, 2, 3, 4, 5, 6]) # but forward only 1st 4 to someapi.foo
foo({'x':1, 'y':2, 'z':3, 'r':4})
foo(x=1, y=2, z=3, r=4)
foo(a=0, b=0, x=1, y=2, z=3, r=4) # but forward only x,y,z,r someapi.foo
Run Code Online (Sandbox Code Playgroud)

我认为没有必要支持混合位置和关键字参数的复杂情况:

foo(3, 4, …
Run Code Online (Sandbox Code Playgroud)

python arguments design-patterns idioms python-3.x

3
推荐指数
1
解决办法
2461
查看次数

是否有与 memmove 等效的标准库?

标准库提供了std::copy,它可以被视为 C 的泛化/泛化memcpy()。它还保持 , 的要求memcpy(),使范围 [ first, ) 与范围 [ , )last不相交;否则我们会有未定义的行为。d_firstd_first + std::distance(first, last)

我的问题:是否有一个通用版本std::memmove(即不提出该要求并且通常使用临时缓冲区来实现)?如果不是,怎么会呢?

c++ idioms memcpy memmove stdcopy

3
推荐指数
1
解决办法
600
查看次数

如何从 Java 访问 Kotlin 的“backtickedFunctions”?

长话短说:

java中是否有一个简单的语法来访问kotlins反引号函数,例如fun `if`(){...}

长版:

在 Kotlin 中,人们可以编写以下类。

class ShapeShifter {
    fun speak() { println("Hello fellow hooman") }
    fun `speakLikeA`() { println("Meow") }
    fun `speakLikeA`() { println("Bwoof !") }
    fun `speakLikeA`() { println("NOOT NOOT ! (you would'nt have so much problems with linux ...)") }
}
Run Code Online (Sandbox Code Playgroud)

这会工作得很好......你所有的 kotlin-ers 同事都可以以你所有的形式与你交谈,如下所示:

ShapeShifter().`speakLikeA`() // would work like a charm
Run Code Online (Sandbox Code Playgroud)

但是当与 java-ist 麻瓜互动时,你的秘密身份将是安全的,因为我很确定 java-ist 只能像这样与你互动:

new ShapeShifter().speak()
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有一种方法可以让 java 普通人访问反引号的 kotlin 函数,而无需诉诸使用黑魔法,例如内省/反射,如下所示:

var tomJedusor = new ShapeShifter();
ShapeShifter.class.getDeclaredMethod("speakLikeA").invoke(tomJedusor); //the forbidden arcane spell …
Run Code Online (Sandbox Code Playgroud)

java syntax idioms language-interoperability kotlin

3
推荐指数
1
解决办法
67
查看次数

返回 Option<Vec<_>> 更好还是只返回空 Vec<_> 更好?

假设我正在编写一个函数,它接受一堆字符串并过滤掉“坏”字符串。

然后该函数返回一些字符串,但有可能所有字符串都被过滤掉。

所以我想知道,我应该用Option这里吗?我可以看到,None当所有字符串都是“坏”时,该函数返回选项变体,Some当字符串是“好”时,它返回变体,这是有道理的。

函数签名可能如下所示:

pub fn filter_strings(inputs: Vec<String>) -> Option<Vec<String>> {
    // Todo...
}
Run Code Online (Sandbox Code Playgroud)

但将其设为 真的有任何意义吗Option

这是否会让事情变得不必要地更加复杂,因为消费者现在需要检查变体以及它返回空向量的None情况?Some

在 Rust 中,仅返回字符串向量是否更简单、更“惯用”?

pub fn filter_strings(inputs: Vec<String>) -> Vec<String> {
    // Todo...
}
Run Code Online (Sandbox Code Playgroud)

还是Option在这里使用我所缺少的一些优点?

idioms vector rust option-type

3
推荐指数
1
解决办法
502
查看次数

.NET是否删除了各种语言之间的区别?

我们总是使用在特定场景中使用的语言.对于快速原型开发,VB6是一个明显的选择.在具有简单桌面用户界面以及标准和非复杂数据库交互要求的项目中选择了VB6.如果您想使用低级例程开发设备驱动程序,则可能依赖于C或Visual C++.ASP是Web界面开发的标准选择.每种语言都有一个特定的"域名"或"专业化",粗略地说.

使用.NET框架,所有语言都可以互操作,并且可能是一致的.你可以拥有一个包含不同语言模块的项目,但最终都得到了相似的处理(所有这些都被编译为IL).

这是否意味着我们之前的区别不再存在?这种区别并不一定是坏事,而是设计上存在的东西,而不是由于任何约束.显然,.NET框架及其对各种语言的处理有所减弱.

.net programming-languages idioms

2
推荐指数
2
解决办法
282
查看次数

在Java中重用循环中变量的首选方法

出于以下情况,这是重用section矢量的首选方式?

Iterator<Vector> outputIter = parsedOutput.iterator();

while(outputIter.hasNext()) {
    Vector section = outputIter.next();
}
Run Code Online (Sandbox Code Playgroud)

要么

Vector section = null;

while(outputIter.hasNext()) {
    section = outputIter.next();
}
Run Code Online (Sandbox Code Playgroud)

java idioms

2
推荐指数
2
解决办法
1426
查看次数

如何使用移除擦除习语去除向量中的空向量?

我使用移除擦除习语(如从矢量中删除元素)移除矢量中的空矢量时遇到一些麻烦.我该如何申请:

vector<vector<Point> > contours; // want to remove contours.at(i).empty()
contours.erase(remove(contours.begin(), contours.end(), ??? ),contours.end());
Run Code Online (Sandbox Code Playgroud)

c++ idioms

2
推荐指数
2
解决办法
1087
查看次数

无需try/catch即可安全地访问Python中的对象

在Objective-C中,您可以执行[variable valueForKeyPath:@"abc.def"]或者[[variable abc] def]如果 abc不存在,variablenil最终会获得一个值,并且不会出现错误或异常.这真的很方便.Python中有这样的东西吗?我知道你可以做(​​至少对于词典)

abc = variable.get('abc', None)
if abc:
    def = abc.get('def', None)
Run Code Online (Sandbox Code Playgroud)

要么

try:
    def = variable.get('abc').get('def')
except:
    pass
Run Code Online (Sandbox Code Playgroud)

这似乎令人难以置信的冗长.当我只想访问对象的属性或获取None值时,有更简单的方法吗?

python idioms accessor

2
推荐指数
1
解决办法
462
查看次数

Perl:qx或Die

简单的任务:

我有一个带线的脚本:

qx(wget -P $destination $file) || die "i can't download file: $file!\n";

但每次(如果成功与否),脚本都会死掉.

我应该如何将其改为成语行为?(成功 - 生活,不 - 死)

感谢帮助!

某些版本:我想知道所有日志,所以我更喜欢使用这样的行:

print qx(...)||die"EXPLAIN";

perl idioms

2
推荐指数
1
解决办法
933
查看次数

惯用于抽象资源分配/解除分配

是否有一种习惯性的Go方式来抽象资源分配/解除分配?我最初的猜测是在高阶函数中抽象分配/释放:

func withResource(f func(Resource)error) error {
    // allocate resource
    // defer free resource
    return f(resource)
}
Run Code Online (Sandbox Code Playgroud)

然而,这种思路直接来自功能范式,似乎与Go的主要命令本质不一致.

作为一个具体的例子,在一段代码的持续时间内运行一个守护进程是我当前项目中反复出现的主题,所以我创建了一个withDaemon抽象共性的函数:

func withDaemon(
    cmd *exec.Cmd,
    f func(io.ReadCloser, io.ReadCloser, io.WriteCloser) error,
) error {
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stdout: %v", err)
    }

    stderr, err := cmd.StdoutPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stderr: %v", err)
    }

    stdin, err := cmd.StdinPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stdin: %v", err)
    } …
Run Code Online (Sandbox Code Playgroud)

error-handling resources idioms go

2
推荐指数
1
解决办法
82
查看次数