函数应根据行名称选择表中的行(在本例中为第2列).它应该能够将单个名称或名称列表作为参数并正确处理它们.
这就是我现在所拥有的,但理想情况下不存在这种重复的代码,并且会像智能一样使用类似的方法来选择处理输入参数的正确方法:
def select_rows(to_select):
# For a list
for row in range(0, table.numRows()):
if _table.item(row, 1).text() in to_select:
table.selectRow(row)
# For a single integer
for row in range(0, table.numRows()):
if _table.item(row, 1).text() == to_select:
table.selectRow(row)
Run Code Online (Sandbox Code Playgroud) 我想基于它可能是类似地图的对象或类似序列的对象的事实对参数执行操作.我知道没有策略可以100%可靠地进行类型检查,但我正在寻找一个强大的解决方案.
基于这个答案,我知道如何确定某些东西是否是一个序列,我可以在检查对象是否是地图后进行检查.
def ismap(arg):
# How to implement this?
def isseq(arg):
return hasattr(arg,"__iter__")
def operation(arg):
if ismap(arg):
# Do something with a dict-like object
elif isseq(arg):
# Do something with a sequence-like object
else:
# Do something else
Run Code Online (Sandbox Code Playgroud)
因为序列可以看作键是整数的映射,我应该尝试找到一个不是整数的键吗?或者我可以查看字符串表示?要么...?
UPDATE
我选择了SilentGhost的答案,因为它看起来是最"正确"的答案,但根据我的需要,这是我最终实现的解决方案:
if hasattr(arg, 'keys') and hasattr(arg, '__getitem__'):
# Do something with a map
elif hasattr(arg, '__iter__'):
# Do something with a sequence/iterable
else:
# Do something else
Run Code Online (Sandbox Code Playgroud)
本质上,我不想依赖ABC,因为有许多自定义类的行为类似于序列和字典,但仍然没有扩展python集合ABCs(参见@Manoj评论).我认为键属性(由删除他/她的答案的人提到)对映射是一个很好的检查.
扩展序列和映射ABC的类也将与此解决方案一起使用.
我有一个函数,它获取DB表的列表作为参数,并返回要在这些表上执行的命令字符串,例如:
pg_dump( file='/tmp/dump.sql',
tables=('stack', 'overflow'),
port=5434
name=europe)
Run Code Online (Sandbox Code Playgroud)
应该返回类似的东西:
pg_dump -t stack -t overflow -f /tmp/dump.sql -p 5434 europe
Run Code Online (Sandbox Code Playgroud)
这是使用完成的tables_string='-t '+' -t '.join(tables)
.
当用以下函数调用函数时开始有趣:( tables=('stackoverflow')
一个字符串)而不是tables=('stackoverflow',)
(一个元组),它产生:
pg_dump -t s -t t -t a -t c -t k -t o -t v -t e -t r -t f -t l -t o -t w
-f /tmp/dump.sql -p 5434 europe
Run Code Online (Sandbox Code Playgroud)
因为字符串本身正在迭代.
这个SO问题建议在类型上使用断言,但我不确定它是否足够Pythonic,因为它打破了鸭式约定.
任何见解?
亚当
在Python中,如何确定可迭代对象是否具有稳定的迭代顺序?
有collections.Iterable
抽象的基类,但没有稳定的对应类。
我问的原因是为了能够防止用户或不稳定的迭代顺序(警告他们,当他们通过考试(错误)迭代dict
,set
等等)的函数,其中迭代的稳定性是至关重要的。
我有一个设计问题.我想编写一个方法接受单个对象或可迭代的对象.例如,假设我有类Dog:
class Dog(object):
"""
An animal with four legs that may slobber a lot
"""
def __init__(self, name="Fido"):
self.name = name
Run Code Online (Sandbox Code Playgroud)
现在让我们说我有一个使用Dog类的类,比如DogWalker:
class DogWalker(object):
"""
Someone who cares for Fido when Human Companion is not available
"""
def __init__(self):
self.dogs_walked = 0
self.dogs_watered = 0
def walk(self, dogs):
"""
Take a dog for a walk
"""
# This is not Pythonic
if isinstance(Dog, dogs):
# Walk a single dog
pass
self.dogs_walked +=1
else:
# walk lots of dogs
pass
def …
Run Code Online (Sandbox Code Playgroud) 似乎原子类型(int,string,...)是通过值传递的,而所有其他的(对象,指向函数的指针,指向方法的指针......)都是通过引用传递的.
检查变量是按值传递还是按引用传递的最佳方法是什么?
isinstance(input_, float) or isinstance(input_, basestring) or <...>
Run Code Online (Sandbox Code Playgroud)
似乎非常不优雅.
我需要它的原因如下:我有一个包装wx.Button的类,如果args/kwargs是按值传递的类型,则不会考虑更新其他对象中的值.所以一些检查将是有益的
class PalpyButton(wx.Button):
def __init__(self, parent, btnLabel, handler, successMsg = None, args = (), kwargs = {}):
super(PalpyButton, self).__init__(parent, -1, btnLabel)
self.handler = handler
self.successMsg = successMsg
parent.Bind(wx.EVT_BUTTON, lambda event: self.onClick(event, *args, **kwargs), self)
def onClick(self, event, *args, **kwargs):
try:
self.handler(*args, **kwargs)
if self.successMsg != None:
if hasattr(self.successMsg, '__call__'):
showInfoMessageBox(self.successMsg())
else:
showInfoMessageBox(self.successMsg)
except BaseException, detail:
showErrorMessageBox(detail)
Run Code Online (Sandbox Code Playgroud) python ×7
collections ×1
dictionary ×1
duck-typing ×1
function ×1
integer ×1
iterator ×1
list ×1
sequence ×1
types ×1