2013-07-09 65 views
1

爲什麼我不能這樣做?Python中的布爾運算符

extout = os.path.splitext(args.outputfile)[1].lower() 
if extout != (".csv" | ".xml"): # <------- creates error 
     sys.stderr.write('ERROR: Invalid extension or none found. This program only recognizes .csv or .xml extensions %s\n') 
     sys.exit(1) 

這給了我一個錯誤類型:

Unsupported operand types for |: 'str' and 'str' 

回答

10

使用一個元組和not in

if extout not in (".csv", ".xml"): 

這將返回True如果extout不匹配任何的元組的項目,否則False的。

|是python中的位運算符,這就是爲什麼它不處理字符串。

+1

這是正確的答案,和Pythonic。 – Tadeck

+1

根據Python 3.2中的[optimizations](http://docs.python.org/3.4/whatsnew/3.2.html#optimizations),你應該寫'如果extout不在{「.csv」,「.xml 「}:'而不是。 –

-1

爲了測試某個東西是不是兩值中取,使用in,如下:

if extout not in (".csv", ".xml"): 
    # Do Something. 

額外注意

| is bi twise或。它不能應用於字符串。您正在尋找布爾型or

>>> 'abc' | 'def' 

Traceback (most recent call last): 
    File "<pyshell#38>", line 1, in <module> 
    'abc' | 'def' 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 

>>> 'abc' or 'def' 
'abc' 

因爲短路的or返回` 'ABC'。

+2

-1號,'名爲 「.csv」 或 「.XML 」'只是計算結果爲'名爲「 .csv」'。 – delnan

+0

對不起。修正了。添加它作爲一個額外的筆記,而不是主要的答案。 –

+0

偉大的,downvote刪除。 – delnan

4

最簡單的方式做你想做的是:

if extout not in ('.csv', '.xml'): 
    ... 
+0

另一個pythonic答案。 Upvote去找你。 – Tadeck

0

你也可以使用

if extout != ".csv" and extout != ".xml": 

可縮短至

if '.csv' != extout != '.xml': 

或者,當然:

if not (extout == '.csv' or extout == '.xml'): 

或使用正則表達式,那麼你可以使用你喜歡的|符號:

if re.match(r'\.(csv|xml)$', extout):