检查对象python的类型

时间:2015-12-07 02:48:57

标签: python string list printing

我有一个用于打印项目列表的实用程序方法,它还处理其他一些事情(比如删除换行符等)。 我想扩展我的功能,所以我也可以传递它的字符串,它将以与列表相同的方式打印字符串。目前,它将分别迭代并打印字符串的每一行。这是一个例子:

#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

所以我的想法是检查变量是否是一个字符串,它就是,把它变成一个列表。但是,如果变量是一个列表,请不要管它。我怎样才能完成这个或者我可以通过其他方式完成这项任务?

2 个答案:

答案 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