2013-04-09 15 views
3

我是比較新的節目,所以我請你原諒,如果我參照以下爲鴨打字使得一個可笑的錯誤。如何元組,並通過「鴨打字」一個簡單的字符串區分?

我有接收或者字符串一個元組(含有串)作爲單個參數的過程。

例子:

def proc(arg): 
    try: 
     arg is a tuple 
     handle arg a tuple 
    except: 
     arg is a simple string 
     handle it so 

根據參數是否是一個元組或不,我希望函數表現不同。

我不想類型檢查,並想用一個try..except過程。

我想過嘗試arg[0],但在Python字符串對象,以及在這方面,他們表現得像元組和返回的東西。

我能在這裏做什麼?

謝謝。

+0

異常應該用於*特殊情況*不處理常規運行時。 – 2013-04-09 15:07:22

+3

@AramKocharyan:實際上,在Python中,爲控制流目的使用異常是完全可以接受的。不過,我不會在這裏使用它。 – 2013-04-09 15:08:52

+0

當你的代碼期望事物以相同的方式行事時,你應該使用異常*總是*而不是。在這裏,你希望代碼的行爲有所不同,具體取決於變量,所以你不應該試試..except,而是檢查它是什麼。 – 2013-04-09 15:09:53

回答

5

在你的情況我建議你不要try..except,因爲要表現不同,這取決於變量的類型......

這是當你不規矩不同,你應該使用try ..除。

從我的評論:

您應該使用時,你的代碼需要的東西在 總是採取同樣的方式,並沒有異常。在這裏,你想要的代碼的行爲 的不同取決於變量,所以你不應該try..except, 而是檢查它是什麼

您可以使用isinstance

isinstance(x, tuple) 

參考this post的區別isinstancetype

All about Duck Typing and Forgiveness


之間使用你的代碼,我的回答創建一個解決方案:

def proc(arg): 
    if isinstance(arg, tuple): 
     # handle as tuple 
    elif isinstance(arg, str): 
     # handle as str 
    else: 
     # unhandled? 
+2

你好。我也想過isinstance,但它不是**類型檢查**,這是不鼓勵? – Phil 2013-04-09 15:04:56

+0

@菲爾:在很多情況下,這是要走的路。我個人會這樣做'isinstance(x,basestring)',因爲通常情況下,字符串是例外,而不是元組。儘管如此,這取決於你想要做什麼。 – 2013-04-09 15:06:15

+1

確定它「不鼓勵」。但是這種語言有這些重做的工具。有時候類型檢查是最好的方法。 – kindall 2013-04-09 15:08:38

0

如果您想要它AY:

>>> s='vd sd' 
>>> t=('ds','') 
>>> t+='34' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can only concatenate tuple (not "str") to tuple 
>>> s+='34' 
>>> 
+0

嗨!雖然我決定不去嘗試......除了路線,這是一個很好的輸入。從來沒有想過通過這種方式來區分兩者。謝謝! – Phil 2013-04-09 15:42:00

1

,我認爲你的錯誤(不是很「荒謬」,因爲即使是有經驗的程序員有時候讓它)在這裏:

我有收到一個字符串或一個元組(包含程序弦)作爲單個參數...根據不同的參數是否是一個元組或不,我想要的功能,以不同的表現。

不要這樣設計你的功能。函數應該做一個東西,如果你需要兩個不同的東西,寫兩個功能:

def process_item(some_string): 
def process_items(tuple_of_strings): 

雖然在Python中,變量和參數沒有顯式類型應保持類型 - 也就是,在任何點你的程序你應該能夠知道每個變量是什麼類型。冒着誇張的風險,我會說你的代碼中的每一個isinstance都是設計缺陷的標誌。修復您的設計,並且不需要解決方法。

+0

你好。感謝您的寶貴意見。最後,這幾乎是我最終做的事情,並且它極大地清除了代碼,一切都看起來好多了。 – Phil 2013-04-09 15:41:13

相關問題