2013-11-01 58 views
0

我正在寫一些庫函數,我發現自己希望函數接受一個字符串或一個字符串列表的輸入,並返回相同的類型。Python「string-or-string-list」類型約定?

我曾想到過幾種方法,但都顯得笨拙。對於每個概念函數,我可以寫:

  • 一個單獨的函數用於字符串和字符串列表。但是這需要調用代碼來知道變量的類型,並選擇適當的函數。
  • 只是一個函數,它根據使用'isinstance(inputarg,str):'檢測輸入類型來決定做什麼。這至少隱藏了庫中的多個選項,而不是在調用者中。

但我想知道是否有一些更優雅的方法或成語,我忽略了?

澄清:在這兩種解決方案中,我更喜歡第二種方法,即創建一個多態的單個函數,以接受(並返回)字符串或字符串列表。然而,即使在這種情況下,基於isinstance()的切換看起來像是一種不雅,可能有更好的選擇。

+0

我很少希望將單個值當作一系列這樣的值處理。您能提供一個更具體的例子嗎? – user2864740

+0

字符串列表是否執行其他操作,而不是將單個字符串所使用的邏輯應用於列表中的每個元素,可能返回結果值列表? – SingleNegationElimination

+0

只要是最完整的,你可以有一個函數,它需要兩個參數(每種類型之一)並且使用不是無的。但我認爲這不合格的「優雅」測試。 :-)根據預期的使用情況,可變參數可能有意義。我喜歡你的兩種方法。命名該方法並很好地引用。 –

回答

1

isinstance是可以的。

更好的方法是測試你需要的字符串(而不是列表)的某種方法,然後再次測試列表(而不是字符串)所需的某種方法,如果兩者都得不到,則引發一個AssertionError。

您可以測試使用hasattr()的方法。

+0

請注意,字符串*是一串字符串。所以除非你明確指出它需要一個'list',而不是像'tuple'這樣的其他任何類型的序列,否則你不能真正測試你需要的序列而不是字符串。你可以用另一種方式來測試,不在其他序列上的字符串。當然,理想情況下,當輸入是一個字符串時,你實際上會使用一些字符串函數,在這種情況下,你可以繼續使用它,當它不是字符串時捕獲異常,並且執行你所做的事情一串字符串。 –

+0

說明:字符串=字符序列(即:不是字符串序列)。此外,@ dstromberg的想法測試列表的方法是好的,只要檢查字符串後完成。但是需要指出的是,首先檢查一個序列會不必要地接受一個字符串。 – gwideman

1

我會傾向於只有一個函數採取可迭代的字符串。如果您需要使用單個字符串s調用它,則始終可以將其稱爲f([s])f((s,))

+0

這是一個額外的方法,但是這仍然需要調用者知道s的類型,並且對字符串vs字符串列表以不同的方式調用f()。 – gwideman

+0

@gwideman:將問題推向調用棧,即調用者的調用者。 :) – NPE

+0

@gwideman通常我們知道所有變量的類型(模子和鴨子打字)。沒有這些知識你就無法真正寫出許多有用的代碼。你的來電者有什麼特別的意思,他們可能不知道這種類型? – delnan