簡體   English   中英

如何通過 Python args 和 kwargs?

[英]How to pass through Python args and kwargs?

雖然我對 Python 的 *args 和 **kwargs 有一個大致的了解(我認為),但我無法理解如何將它們從一個函數傳遞到另一個函數。 這是我的模型:

from pdb import set_trace as debug
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return u'%s' % self.name

    def save_name_for(self, *args, **kwargs):
        self.name = 'Alex'
        return self

    def save_name(self, *args, **kwargs):
        debug()
        self.save_name_for(self, args, kwargs)
        self.save()

我已將保存名稱拆分為上面的兩個函數。 通過這種方式,我可以通過對 save_name_for 方法進行單元測試來對通常將所有內容放在 save_name 方法中的邏輯進行單元測試。

當我在解釋器中運行它並在 save_name 方法中停止時,正如我所料,我看到了:

(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}

如果我隨后進入 save_name_for 方法,我會看到:

(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs = 

有沒有辦法將 save_name 方法接收到的 kwargs 直接傳遞給 save_name_for 方法,以便它們出現在后者的 kwargs 中? 我想在 save_name_for 方法的名稱空間中看到類似的內容:

(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}   # <= I want this

我意識到我可以在 save_name 中解析它們,然后將它們顯式傳遞給 save_name_for ,但這似乎很不優雅。 我還想我可能會這樣做,因為 args 是一個元組......

kwargs = args[2]

...但它似乎不起作用。 args[2] 就是一切(我不明白這一點)。 有沒有一種 Pythonic 的方法來做到這一點?

***運算符用於兩種不同的情況。

  1. 當用作函數定義的一部分時,

     def save_name_for(self, *args, **kwargs):

    它用於分別表示任意數量的位置或關鍵字參數。 要記住的一點是,函數內部args將是一個 tuple ,而kwargs將是一個 dict

  2. 當用作函數調用的一部分時,

     args = (1, 2) kwargs = {'last': 'Doe', 'first': 'John'} self.save_name_for(*args, **kwargs)

    ***充當解包操作符 args必須是 iterable ,而kwargs必須是 dict-like args中的項目將被解包並作為位置參數發送給函數,而kwargs中的鍵/值對將作為關鍵字參數發送給函數。 因此,

     self.save_name_for(*args, **kwargs)

    相當於

    self.save_name_for(1, 2, last='Doe', first='John')

另請參閱saltycrane 博客以獲取示例說明。

您使用與參數語法相同的語法傳遞它們:

self.save_name_for(*args, **kwargs)

請注意,您不需要傳入self save_name_for已經綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM