- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否有别名函数参数的语法?如果没有,是否有任何 PEP 提案?我不是编程语言理论家,所以我的观点可能是无知的,但我认为实现某种函数 arg 别名可能很有用。
我正在对 libcloud 做一些更改我的想法将帮助我避免在更改 API 时破坏他人。
例如,假设我正在重构并想将函数参数“foo”重命名为“bar”:
原文:
def fn(foo):
<code (using 'foo')>
我可以:
def fn(foo, bar=None):
if foo and bar:
raise Exception('Please use foo and bar mutually exclusively.')
bar = foo or bar
<code (using 'bar')>
# But this is undesirable because it changes the method signature to allow
# a new parameter slot.
fn('hello world', 'goodbye world')
我未提炼的语法糖想法:
def fn(bar|foo|baz):
# Callers can use foo, bar, or baz, but only the leftmost arg name
# is used in the method code block. In this case, it would be bar.
# The python runtime would enforce mutual exclusion between foo,
# bar, and baz.
<code (using 'bar')>
# Valid uses:
fn(foo='hello world')
fn(bar='hello world')
fn(baz='hello world')
fn('hello world')
# Invalid uses (would raise some exception):
fn(foo='hello world', bar='goodbye world')
fn('hello world', baz='goodbye world')
最佳答案
不,没有这样的语法糖。
您可以使用 **kwargs
来捕获额外的关键字参数并在其中查找已弃用的名称(如果不存在则引发异常)。您甚至可以使用装饰器将其自动化。
from functools import wraps
def renamed_argument(old_name, new_name):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
if old_name in kwargs:
if new_name in kwargs:
raise ValueError(
"Can't use both the old name {} and new name {}. "
"The new name is preferred.".format(old_name, new_name))
kwargs[new_name] = kwargs.pop(old_name)
return func(*args, **kwargs)
return wrapper
return decorator
@renamed_argument('bar', 'foo')
def fn(foo=None):
<method code>
演示:
>>> @renamed_argument('bar', 'foo')
... def fn(foo=None):
... return foo
...
>>> fn() # default None returned
>>> fn(foo='spam')
'spam'
>>> fn(bar='spam')
'spam'
>>> fn(foo='eggs', bar='spam')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in wrapper
ValueError: Can't use both the old name bar and new name foo. The new name is preferred.
关于Python 语法糖 : function arg aliases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556673/
以下从 JPA 查询中获取 Spring 数据投影的方法对我不起作用: https://stackoverflow.com/a/45443776/1005607 我的 table : 查找_T id
tl;dr - 我想覆盖 OhMyZsh具有多行别名/函数的 Git 别名。 我正在尝试从 bash 切换到 zsh 并迁移我的别名。我可以通过这个(示例)覆盖 OhMyZsh 的 Git 别名: a
根据 this关于 C++11/14 严格别名规则的 stackoverflow 回答: If a program attempts to access the stored value of an
这个问题已经有答案了: How do I clone a list so that it doesn't change unexpectedly after assignment? (24 个回答)
这个问题在这里已经有了答案: Can I alias a subcommand? (shortening the output of `docker ps`) (4 个答案) 关闭 7 年前。 我知
我什至不知道它是否被称为别名,但无论如何让我继续。 您知道 C# 中的 System.String 类型是如何与“字符串”“别名”的吗?在 Visual Studio 中,“string”是小写的蓝色
练习测试问题: Consider the following code: String entree = new String (“chicken”); String side = “salad”;
我在优秀的 F# for Fun and Profit 中读到,我可以使用单案例区分联合来获得类型安全等。所以我试着这样做。但是我很快发现我无法调用被 DU(有点)别名或查看的类型的方法。 这是一个例
为什么会出现 Error in query (1064): Syntax error near 'as q2)' at line 7 与 SELECT SQL_NO_CACHE q1.d1, q1.a
我对在函数参数中使用别名有疑问。这是我的问题。 让我们考虑一下这个函数定义 void thisIsSparta(int& number){ ... } 在调用时,它与以下代码配合得很好: in
我将如何完成以下任务? >>> x={'NON_EPISODIC_MOVIE': 11} >>> for k,v in x.items(): ... k=v ... >>> NON_EPISO
' Strict aliasing ' 优化需要特别注意源代码,s.a.使用 union 而不是指针转换。有没有一种方法可以使用预处理器指令 (#if/else) 来检测编译器是否正在尝试进行此类优化
这个问题在这里已经有了答案: What is the strict aliasing rule? (11 个答案) 关闭 8 年前。 我真的很困惑。 uint8_t hash[20]; uint32
什么是“别名流缓冲区”?我在 answer 的评论中遇到了这个词我的。 最佳答案 我以前从没听过这个词,但在你引用的话题中,使用它的人还举了一个例子:两条流使用相同的 streambuf。 当然,只是
这是我的场景: public IEnumerable getSuperMercTree(string IDLanguage) { SuperMercModel SMer = null;
例如,此声明带有 deriving : {-# LANGUAGE DeriveDataTypeable, ConstraintKinds #-} import Data.Data (Data) imp
我患有the problem described here的变体: ActiveRecord assigns table aliases for association joins fairly un
我使用了 highcharts 库中的基本折线图,但我认为线条不够平滑。 有可能改进吗? 我的代码: chart: { type:'line',
创建 JavaFX 场景时,我传入 SceneAntialiasing.BALANCED 作为参数,但在我的笔记本电脑上它给了我这个警告: WARNING: System can't support
我试图用 renderEncoder 的 drawIndexedPrimitives 画一个半圆 [renderEncoder setVertexBuffer:self.vertexBuffer of
我是一名优秀的程序员,十分优秀!