【问题标题】:Python Assignment of Variables in Method Calls方法调用中变量的 Python 赋值
【发布时间】:2022-06-10 17:41:23
【问题描述】:

在方法调用中分配变量的目的、好处或想法是什么?

例如,具有以下签名的方法:

def get_version(self, workspace):

可以这样调用:

fgdbversion_id = repos.get_version(workspace=test_workspace)

显然这会将workspace 参数设置为test_workspace,但为什么不直接发送get_version(test_workspace)。那不会达到同样的效果吗?我认为不会,否则为什么要这样做。如果分配是在方法端,它将是一个默认值,但我没有在调用端得到它。

我尝试了很多不同的方式在谷歌上搜索它,但我找不到任何东西。

提前谢谢你。

【问题讨论】:

    标签: python methods parameters arcpy


    【解决方案1】:

    这不是变量的赋值,而是关键字参数的指定(与您习惯的位置参数相反)。这样你就可以乱序设置参数,或者跳过一些可选参数。

    例如,内置函数 open 就是这样声明的(或者更确切地说,如果它实际上是用 Python 编写的):

    def open(file, mode='r', buffering=-1, encoding=None,
             errors=None, newline=None, closefd=True, opener=None):
    

    如果你想用"w"模式打开"output.txt",你可以说

    open("output.txt", "w")
    

    还有

    open(file="output.txt", mode="w")
    

    甚至

    open(mode="w", file="output.txt")
    

    到目前为止,这似乎并不是那么有用。但是如果你想指定encoding,但不关心buffering怎么办?你可以这样做:

    open("output.txt", "w", -1, "utf-8")
    

    但是你需要确切地知道buffering 的默认值是什么。能够以某种方式...跳过它不是更容易吗?

    open("output.txt", "w", encoding="utf-8")
    

    【讨论】:

    • 另外值得补充的是,使用关键字参数通常可以提高可读性,例如不太熟悉open 函数签名的人在阅读open("output.txt", "w", -1, "utf-8") 时很难弄清楚-1 的用途,而无需查阅文档。
    • @blhsing 绝对正确。事实上,我已经使用了很多很多次open,但是今天,当我去构建这个例子时,我第一次看到buffering 在那里(尽管我显然知道open 有很多争论并且会是这个例子的一个很好的候选人)。如果我在代码中看到open("output.txt", "w", -1, "utf-8"),我绝对需要查找文档。
    • 即使是文档doesn't explain the -1 :-)
    • 问题中的方法只有一个参数(self 除外),所以这些参数在那里没有多大意义......我的猜测是它是为了一致性/一些风格指南。
    • @KellyBundy Fair。当函数只有一个参数时,它有点冗长和多余(尽管本身显然没有错)。我主要是在回答“它是什么”的字面问题,而不是可能隐含的问题“它在 here 做什么”。
    【解决方案2】:

    它可以让您决定要传递的参数,而不管它在函数声明中出现的顺序或有多少其他参数(假设它们具有默认值)。

    当你调用一个带有多个参数的函数时,通常情况下,它会按照它们被声明的顺序来接受这些参数。指定您尝试传递的参数允许您忽略该顺序并在任何位置传递任何参数。

    例如,假设我们有一个简单的函数,它返回格式化的当前进程 ID,它只需要一个前缀和一个后缀,并将进程 ID 放在中间:

    import os
    
    
    def format_pid(prefix="", sufix=""):
         return f"{prefix}{os.getpid()}{sufix}"
    

    现在,如果我这样调用该函数:

    print(format_pid(" before ", " after "))
    

    它会像你期望的那样工作并输出:

     before 458496 after 
    

    但是如果我指定我要使用的参数,我实际上可以让它以相反的顺序获取参数:

    print(format_pid(sufix=" before ", prefix=" after "))
    

    输出:

     after 458496 before 
    

    但是当你有一个可以接受多个参数但你只想传递一个参数的函数时,它的真正用处就来了。例如,如果我这样做:

    print(format_pid(" -- "))
    

    它会自动将该参数视为前缀:

     -- 458496
    

    但如果我想让它成为后缀,我可以这样做:

    print(format_pid(sufix=" -- "))
    

    输出:

    458496 -- 
    

    这可能看起来微不足道,但这实际上是一个救星把一些可选的放在最后(一开始它会迫使用户每次都通过它们)。

    一个很好的例子是古老的print 函数。看看它的声明:

    print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
    

    它有四个我们几乎不担心的可选参数,除了我们真正想要更改它们的更具体的情况,在这种情况下,我们在函数调用中指定一个:

    print("I am fine", "What about you", sep=". ", end="?\n")
    

    输出:

    I am fine. What about you?
    

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2021-07-30
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多