我有一个用于打印项目列表的实用程序方法,它还处理其他一些事情(比如删除换行符等)。 我想扩展我的功能,所以我也可以传递它的字符串,它将以与列表相同的方式打印字符串。目前,它将分别迭代并打印字符串的每一行。这是一个例子:
#The function
def print_content(content):
#do some modification of the list
for i in content:
print(i)
#if I pass in a list, I will get output like:
>Item 1
>Item 2
>Item 3
#if I pass in a string, I will get output like:
>I
>t
>e
>m
>
>1
#But I would like it to read:
>Item 1
所以我的想法是检查变量是否是一个字符串,它就是,把它变成一个列表。但是,如果变量是一个列表,请不要管它。我怎样才能完成这个或者我可以通过其他方式完成这项任务?
答案 0 :(得分:0)
虽然我认为马蒂诺的答案有点过分,但他对避免类型检查提出了坚定的观点。我建议你定义一个类,明确你要如何维护你的列表。
#!/usr/bin/python
class Content(object):
def __init__(self):
self.content_list = []
def add_string_to_content(self, a_string):
self.content_list.append(a_string)
def print_content(self):
for i in self.content_list:
print(i)
def append_list_to_content(self, a_list):
self.content_list += a_list
def main():
content_list = ['item 1', 'item 2']
content_string = "item 3"
some_content = Content()
some_content.append_list_to_content(content_list)
some_content.add_string_to_content(content_string)
some_content.print_content()
if __name__ == "__main__":
main()
其输出为:
brock@brock-desktop:~/testing$ python test.py
item 1
item 2
item 3
你甚至可以编写一个小的解析器方法来获取字符串" item 1 item 2"并将其转换为["项目1","项目2"]。关键是该方法将包含在类中并明确命名以避免任何混淆
答案 1 :(得分:-1)
这不是检查特定类型,而是许多人认为非常“非常规”,这是使用基于抽象基类的元类的一般方法。这允许您通过注册它们来有选择地定义您想要考虑 atomic (不可迭代)的类型,无论它们是否是严格的Python意义上的。
如图所示,它可以应用于现有类,也适用于Python 2.6+和& 3.x的它可能看起来像很多代码,但它可以放在一个独立的模块中,以便于重用。
基于问题Correct way to detect sequence parameter?的答案
import abc # requires Py 2.6+
import collections
class _AtomicBase(object):
""" Metaclass of types to be considered indivisible rather than iterable.
usage: isinstance(<obj>, Atomic)
"""
@classmethod
def __subclasshook__(cls, other):
return not issubclass(other, collections.Sequence) or NotImplemented
class Atomic(abc.ABCMeta("NewMeta", (_AtomicBase,), {})):
pass
# use the abstract base class to make strings be considered atomic
try:
# basestring is the abstract superclass of both str and unicode in Py 2.
Atomic.register(basestring) # Will make both types considered Atomic.
except NameError: # 'basestring' is undefined, assume Python >= 3
Atomic.register(str) # str includes unicode in Py 3, make both Atomic
Atomic.register(bytes) # bytes should also be considered Atomic
if __name__ == '__main__':
print('Is [1,2,3] Atomic? -> {}'.format(isinstance([1,2,3], Atomic))) # -> False
print('Is "abc" Atomic? -> {}'.format(isinstance("abc", Atomic))) # -> True