[英]How to use **kwargs to fill in format parameters automatically
我想自動化/簡化:
def test(stream, tag):
subprocess.call('git submodule checkout {stream}-{tag}'.format(stream=stream, tag=tag))
即我想擺脫stream = stream和tag = tag,並以某種方式利用** kwargs之類的東西。 這可能嗎?
我的2美分:請不要濫用**kwargs
,只有在先驗未知參數數量的情況下才應使用它。
以下是一些不涉及**kwargs
:
如果您關心的是行長,則可以使用隱式順序來節省空間:
def test(stream, tag):
subprocess.call('git submodule checkout {}-{}'.format(stream, tag))
這是以格式字符串可讀性為代價的,但是對於單行代碼而言,它可能只是這樣做。
將參數包裝在Checkout
對象中:
class Checkout:
def __init__(self, stream, tag):
self.stream = stream
self.tag = tag
#...
def test(checkout):
subprocess.call('git submodule checkout {0.stream}-{0.tag}'.format(checkout))
甚至:
class Checkout:
def __init__(self, stream, tag):
self.stream = stream
self.tag = tag
def test(self):
subprocess.call('git submodule checkout {0.stream}-{0.tag}'.format(self))
這很冗長,但是Checkout
對象不僅僅是一個簡單的包裝器,它可能在其他地方重用或序列化。
這應該工作:
def test(**kwargs):
subprocess.call("git submodule checkout {stream}-{tag}".format(**kwargs))
現在,您可以添加一些默認值,或者引發更清晰的錯誤消息。
def test(**kwargs):
#set a default value for "stream"
if "stream" not in kwargs:
kwargs["stream"] = "mystream"
if "tag" not in kwargs:
raise ValueError("Please add some tags")
subprocess.call("git submodule checkout {stream}-{tag}".format(**kwargs))
現在,當未設置tag參數時,消息將告訴您。 沒有此代碼,您獲得的唯一信息就是KeyError以及丟失的鍵的名稱。
您可以使用locals()
傳遞局部變量的字典:
def test(stream, tag):
subprocess.call('git submodule checkout {stream}-{tag}'.format(**locals()))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.