假设我有一套西装和四个西装子类:Heart,Spade,Diamond,Club.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Run Code Online (Sandbox Code Playgroud)
我有一个接收套装作为参数的方法,它是一个类对象,而不是一个实例.更确切地说,它可能只收到四个值中的一个:Heart,Spade,Diamond,Club.我怎样才能做出确保这样的事情的断言?就像是:
def my_method(suit):
assert(suit subclass of Suit)
...
Run Code Online (Sandbox Code Playgroud)
我正在使用Python 3.
在下面的代码中,什么更有效/更'Pythonic'?使用try-catch子句或if-else子句?
fname = 'AdobeARM.log'
letters = {}
with open(fname,'r') as f:
for line in f:
for c in line:
try:
letters[c] += 1
except KeyError:
letters[c] = 1
print letters
Run Code Online (Sandbox Code Playgroud)
VS.
fname = 'AdobeARM.log'
letters = {}
with open(fname,'r') as f:
for line in f:
for c in line:
if letters.has_key(c):
letters[c] += 1
else:
letters[c] = 1
print letters
Run Code Online (Sandbox Code Playgroud)
我倾向于使用try catch选项,但我不确定为什么.
假设我有这段代码:
my_dict = {}
default_value = {'surname': '', 'age': 0}
# get info about john, or a default dict
item = my_dict.get('john', default_value)
# edit the data
item[surname] = 'smith'
item[age] = 68
my_dict['john'] = item
Run Code Online (Sandbox Code Playgroud)
如果我们现在检查default_value的值,问题就变得清晰了:
>>> default_value
{'age': 68, 'surname': 'smith'}
Run Code Online (Sandbox Code Playgroud)
很明显,它my_dict.get()
没有返回default_value 的值,而是返回指针(?).
可以通过将代码更改为:
item = my_dict.get('john', {'surname': '', 'age': 0})
Run Code Online (Sandbox Code Playgroud)
但这似乎不是一个很好的方法.有什么想法,评论?
我在python中使用pycurl通过ftp传输文件.我可以使用以下命令在远程服务器上自动创建缺少的目录:
c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1)
Run Code Online (Sandbox Code Playgroud)
由于某些原因,我必须切换到ftplib.但我不知道如何在这里相同.是否有任何选项可以添加到storbinary函数来做到这一点?或者我必须手动创建目录?
是否有任何理由/参数不实现基于谓词/约束限制其成员的Java集合?
鉴于经常需要这样的功能,我期待它已经在apache-commons或Guava等集合框架上实现.但是,虽然apache确实拥有它,但是Guava 弃用了它的版本,并建议不要使用类似的方法.
该Collection接口契约规定的集合可以,只要它是正确记录放在其元素的所有限制,所以我无法理解为什么有人看守的集合将被劝阻.还有什么其他选择可以确保Integer集合永远不会包含负值而不隐藏整个集合?
我试图写一个这个问题的答案,并且很惊讶地发现没有列表的查找方法,列表只有索引方法(字符串有查找和索引).
有人能告诉我背后的理由吗?为什么字符串都有?
如何在Python中检查对象是否支持[]操作?我想到类似以下内容:
if supports(obj, ?[]?):
print("Supports")
Run Code Online (Sandbox Code Playgroud) 这只是一个关于哪一个更"pythonic"的问题
使用if:
import os
somepath = 'c:\\somedir'
filepath = '%s\\thefile.txt' % somepath
if not os.path.exists(somepath) and not os.path.isfile(filepath):
os.makedirs(somepath)
open(filepath, 'a').close
else:
print "file and dir allready exists"
Run Code Online (Sandbox Code Playgroud)
或使用try/Except:
import os
somepath = 'c:\\somedir'
filepath = '%s\\thefile.txt' % somepath
try:
os.makedirs(somepath)
except:
print "dir allready exists"
try:
with open(filepath):
// do something
except:
print "file doens't exist"
Run Code Online (Sandbox Code Playgroud)
正如你在上面的例子中看到的那样,哪一个在python上会更正确?另外,在哪些情况下我应该使用try/except而不是if/else?我的意思是,我应该替换所有我的if/else测试来尝试/除外吗?
提前致谢.
使用 Psycopg2,我需要测试 postgresql 表是否存在。
在类似的问题中,建议使用以下测试:
cursor.execute("select exists(select * from myDb.mytable_%s)" % complementName)
tableExists = cursor.fetchone()[0]
print(tableExists)
Run Code Online (Sandbox Code Playgroud)
如果表已经存在,并且返回 ,则此方法非常有效,但如果表不True
存在,则此方法不起作用。我没有像我需要的那样返回,而是收到错误False
编程错误:关系“myDb.mytable_001”不存在
我究竟做错了什么?False
如果表不存在,我应该怎么做才能得到语句?谢谢你的帮助!
编辑
根据评论中的建议,我也尝试过:
tableExists = cursor.execute("SELECT 1 AS result FROM pg_database WHERE datname='mytable_001'")
Run Code Online (Sandbox Code Playgroud)
和
tableExists = cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = 'mytable_001)')")
Run Code Online (Sandbox Code Playgroud)
但None
无论表是否存在,两者都只是返回 。但是,我不确定语法,也许你可以指出我可能犯的一些新手错误?谢谢!
编辑2 最后,解决方案包括上面后一个查询的组合,并按如下方式获取布尔结果:
cursor.execute("SELECT EXISTS (SELECT 1 AS result FROM pg_tables WHERE schemaname = 'mySchema' AND tablename = …
Run Code Online (Sandbox Code Playgroud) None
让我们考虑这个示例 - 返回列表中第一个值的索引li
(如果存在)或最后一个元素的索引(如果None
不存在于li
.
我可以检查列表中是否有 None,但使用 ifs 不是首选方式 - Dive Into Python 鼓励使用异常,因为据说它们更快并使代码更清晰(请参阅此问题)。所以我采取了三种方法:
1.
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
Run Code Online (Sandbox Code Playgroud)
my_index
在 try/ except 块内声明。更少的行数,没有多余的声明。可能的问题 - 不同的异常类型将导致不创建my_index
脚本并使其崩溃print
。
2.
my_index = None # or anything else
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
Run Code Online (Sandbox Code Playgroud)
my_index
在 try/except 之前声明,并且无论发生什么异常都会分配一个值。缺点——更多的线条,看起来多余。
3. 编辑:不起作用 - 无论 try/ except 结果如何,finally 都会被执行
try: …
Run Code Online (Sandbox Code Playgroud)我有一个程序,我需要做很多计算,但输入可能不完整(所以我们不能总是计算所有结果),这本身就很好,但是会给代码的可读性带来问题:
def try_calc():
a = {'1': 100, '2': 200, '3': 0, '4': -1, '5': None, '6': 'a'}
try:
a['10'] = float(a['1'] * a['2'])
except (ZeroDivisionError, KeyError, TypeError, ValueError) as e:
a['10'] = None
try:
a['11'] = float(a['1'] * a['5'])
except (ZeroDivisionError, KeyError, TypeError, ValueError) as e:
a['11'] = None
try:
a['12'] = float(a['1'] * a['6'])
except (ZeroDivisionError, KeyError, TypeError, ValueError) as e:
a['12'] = None
try:
a['13'] = float(a['1'] / a['2'])
except (ZeroDivisionError, KeyError, TypeError, ValueError) as e:
a['13'] = …
Run Code Online (Sandbox Code Playgroud) 我遇到的代码我不知何故发现"奇怪".
var = None
try:
var = mydict[a][b]
except:
pass
Run Code Online (Sandbox Code Playgroud)
我不太习惯使用try-except
检查dict
键,显然有一个if-else
序列来处理相同的情况.
var = None
if a in mydict:
if b in mydict[a]:
var = mydict[a][b]
Run Code Online (Sandbox Code Playgroud)
使用一种方法比另一种方法有任何"明显的"优势/劣势吗?
python ×11
try-catch ×2
assert ×1
boolean ×1
collections ×1
constraints ×1
dictionary ×1
exception ×1
ftplib ×1
if-statement ×1
java ×1
list ×1
methods ×1
performance ×1
postgresql ×1
predicate ×1
psycopg2 ×1
pycurl ×1
python-2.7 ×1
string ×1
subclass ×1