![](/img/trans.png)
[英]How to pass a function and its arguments through a wrapper function in R? Similar to *args and *kwargs in python
[英]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 的方法來做到這一點?
*
和**
運算符用於兩種不同的情況。
當用作函數定義的一部分時,
def save_name_for(self, *args, **kwargs):
它用於分別表示任意數量的位置或關鍵字參數。 要記住的一點是,函數內部args
將是一個 tuple ,而kwargs
將是一個 dict 。
當用作函數調用的一部分時,
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.