- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下场景中使用 kargs 是否正确?
我有一个函数,在调用中需要五个参数,其中两个参数是可选的。所以,我可以将其删除:
def f(p1, p2, p3, p4, p5, o1=None, o2=None)
或
def f(**kwargs)
因为我正在使用参数做这样的事情:
orig_path = "{0}/{1}/{3}/{4}".format(p1, p2, p3, p4)
或
orig_path = "{p1}/{p2}/{p3}/{p4}".format(kwargs)
我不知道哪种样式是 Python 中声明中使用的正确方式。有没有任何指南可以指导 kwargs 的正确使用?我在 Amazon boto3 api 中看到通常使用 kwargs 构造,但是......
最佳答案
根据经验,如果可以的话,您应该始终写出函数定义中的所有参数,并且最好为它们提供描述性名称。
Explicit is better than implicit.
还有
Readability counts.
使参数显式化可以帮助您防止许多错误,例如使用太多或太少的参数或使用不存在的关键字参数来调用函数。
它还对可读性有很大帮助,因为您可以从定义中轻松地发现函数需要多少个参数和哪些参数,以及可能的关键字参数的顺序和默认值。有时,您甚至可以通过良好的参数名称猜测该函数的功能,而无需查看文档。
某些 IDE 甚至可以在您编写调用时自动查找定义,并在您键入时提醒您可能出现的问题。
这样做:
def twiddle_knobs(tuning, volume, panning=None, bass=6.0, midrange=-2.0, treble=1.5):
"""Modify the most important radio controls."""
my_radio.modify_control(radio.TUNEFREQ, value=max(min(tuning, 120.0), 85.0))
my_radio.modify_control(radio.VOL_MASTER, value=(volume / 100.0))
if panning is not None:
my_radio.modify_control(radio.VOL_LEFT, value=min(1.0 - panning / 100.0, 1.0))
my_radio.modify_control(radio.VOL_RIGHT, value=min(1.0 + panning / 100.0, 1.0))
for control, value in ((radio.EQU_BASS, bass),
(radio.EQU_MID, midrange),
(radio.EQU_TREB, treble)):
my_radio.modify_control(control, value=value, unit=radio.DB)
不要这样做:
def twiddle_knobs(*args, **kwargs): # WARNING: never do this!
my_radio.modify_control(radio.TUNEFREQ, max(min(args[0], 120.0), 85.0))
my_radio.modify_control(radio.VOL_MASTER, args[1] / 100.0)
if kwargs.get("panning") is not None:
my_radio.modify_control(radio.VOL_LEFT, min(1.0 - kwargs["panning"] / 100.0, 1.0))
my_radio.modify_control(radio.VOL_RIGHT, min(1.0 + kwargs["panning"] / 100.0, 1.0))
for control, param, default in ((radio.EQU_BASS, "bass", 6.0),
(radio.EQU_MID, "midrange", -2.0),
(radio.EQU_TREB, "treble", 1.5)):
my_radio.modify_control(control, kwargs.get(param, default), radio.DB)
那么什么时候可以使用*args
和*kwargs
?
*args
的一个用途是当您需要接收以下内容的列表时相似并具有相同的功能。不过,您也可以只需使用普通参数并让调用者显式传入列表。有时,使用 func([thing])
调用函数看起来像是不过,这很尴尬,尤其是当你大多数时候只经过一个有事或根本没有事。这些时候 *args
会改善情况。
此外,当您需要传递一些位置和/或关键字时您的函数收到的参数传递给另一个您没有收到的函数可以控制并且您不想指定哪些参数允许调用者传递,然后 *args
和 *kwargs
-在显式参数之后使用 - 是实现这一目标的方法。
如果您有一组关键字参数可以有力地服务于相关的功能,你不能准确地预先定义什么关键字将是,因为它们可能依赖于某些东西动态变化,这也是使用的一个很好的理由*kwargs
。
此列表并不详尽,但应该可以让您有一个大概的了解。
关于python - 在以下Python代码场景中使用kwargs是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763194/
我有一个像 s = "title='bah' name='john and jill' purple='haze' none=None i=1" 我正在寻找一种将其放入字典的 Pythonic 方式(
我正在通过教程阅读有关模板 View 的内容,其中一些代码让我感到困惑。作者使用了这个代码示例 from django.utils.timezone import now class AboutUsV
看不懂下面的例子,假设我有这些功能: # python likes def save(filename, data, **kwargs): fo = openX(filename, "w",
假设我们有一个像这样的函数声明 def myfunc(a=None,b=None): as_dict = {"a": a, "b": b,
def a(**akwargs): def b(bkwargs=akwargs): # how to not only use akwargs defaultly,but al
阅读 Python 文档,有几种创建字典的方法。 dict() dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs) http
两种方法我都见过,但我不明白它们的区别以及我应该将什么作为“最佳实践”: def custom_function(**kwargs): foo = kwargs.pop('foo')
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我需要将 args 和 kwargs 都存储在一个元组中以便稍后调用,那么在这种情况下元组中的适当值是 *args 还是 args?换句话说,这行得通吗: def __init__(self, *ar
我有这个查询 Location.objects.filter(locations_rate__rate=search_rate).distinct('id') 如何将 distinct() 设置为 *
是否可以简化 kwargs 选项的 bool 检查? 例如在 foo 中我必须检查很多选项: def foo(*args, **kwargs): if 'foo' in kwargs and k
我尝试运行 Python Data Science Essential 一书中的一个示例。但是,当我运行它时出现错误。实际上,我才刚刚开始学习 python。所以,我觉得很难修复这些错误。请帮我。这是
我正在尝试使用以下代码在一个大图中创建多个seaborn regplot: %matplotlib notebook import seaborn as sns from itertools impo
我有一个这样的函数:。如果有参数x,则它一定是布尔值。任何其他命名参数必须为int。。其他人将编写调用foo的函数,我希望他们能够传递x和kwargs。目前,这意味着调用foo()的每个函数除了kwa
当一个类继承自单个类时,调用父方法的首选方式是什么?我知道有两种调用父方法的方法。 选项 1: ParentClass.method(self, *args, **kwargs) 选项 2: supe
问题 我在 Dusty Phillips 的 Object Oriented Programming(为简洁起见而简化)中遇到了这段代码,但我不确定这个定义的特定部分。 class A: de
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
我在下面运行了一个装饰器演示。 def logger(func): def inner(*args, **kwargs): print(args) print(
如何使用“一个”类参数**kwargs设置对象属性? 我想要的是在一个循环中执行此代码: class purchase(): def __init__(self,**kwargs):
我是一名优秀的程序员,十分优秀!