是什么意思,如果一个Python对象是“标化”与否?

问题描述 投票:273回答:5

哪些类型的对象分为“标化”的领域?

python terminology
5个回答
277
投票

这基本上意味着对象实现__getitem__()方法。换句话说,它描述了“容器”的对象,这意味着它们含有其他对象。这包括列表,元组和字典。


65
投票

把我的头顶部,下面是唯一的内置插件是标化的:

string:  "foobar"[3] == "b"
tuple:   (1,2,3,4)[3] == 4
list:    [1,2,3,4][3] == 4
dict:    {"a":1, "b":2, "c":3}["c"] == 3

但是mipadi's answer是正确的 - 实现__getitem__任何一类是标化


15
投票

一个脚本化的对象是记录操作做它,它可以将它们保存为“脚本”,它可以重播的对象。

例如,请参阅:Application Scripting Framework

现在,如果阿利斯泰尔不知道他问什么,真正的意思是“标化”的对象(被别人当作编辑),然后(如mipadi还回答了),这是正确的:

一个可以脚标对象是实现__getitem__特殊的方法(想想列表,字典)的任何对象。


12
投票

在计算下标的意思是:“在程序中使用,单独或与他人,指定一个数组中的元素中的一个的符号(概念上写为一个下标,但在实践中通常不)”。

现在,通过@user2194711给出的简单的例子,我们可以看到,追加要素不能是有两个原因的列表的一部分: -

1)我们是不是真的调用方法追加;因为它需要()调用它。

2)该错误是指示该功能或方法没有脚标;因此它们并不像转位列表或序列。

现在看到这一点: -

>>> var = "myString"
>>> def foo(): return 0
... 
>>> var[3]
't'
>>> foo[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable

这意味着没有下标或类似的它们出现在序列中说元素function;我们不能访问他们像我们这样做,与[]的帮助。

也;如mipadi他回答说。这基本上意味着对象实现__getitem__()方法。 (如果它是标化的)。因此,该错误产生的:

arr.append["HI"]

类型错误:“builtin_function_or_method”对象不是标化


7
投票

我有同样的问题。我在做

arr = []
arr.append["HI"]

因此,使用[是造成错误。它应该是arr.append("HI")


1
投票

作为一个必然结果这里早先的答案,很多时候这是你认为你有一个清单(或字典,或其他标化的对象)时,你不这样做的迹象。

例如,假设你有这应该返回一个列表的功能;

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']

现在,当你调用该函数,并something_happens()出于某种原因不返回True值,会发生什么?该if失败了,所以你告吹; gimme_things没有明确return任何东西 - 这样的话,事实上,它会隐return None。然后,将此代码:

things = gimme_things()
print("My first thing is {0}".format(things[0]))

将失败,“NoneType对象不是标化”,因为,thingsNone,所以你正在尝试做的None[0]因为...错误消息说什么这是没有意义的。

有两种方法来修复代码中的这个bug - 首先是通过检查things避免错误实际上是在尝试使用它之前有效;

things = gimme_things()
if things:
    print("My first thing is {0}".format(things[0]))
else:
    print("No things")  # or raise an error, or do nothing, or ...

或等效陷阱TypeError除外;

things = gimme_things()
try:
    print("My first thing is {0}".format(things[0]))
except TypeError:
    print("No things")  # or raise an error, or do nothing, or ...

另一种方法是重新设计gimme_things让你确保它始终返回一个列表。在这种情况下,这可能是简单的设计,因为这意味着,如果有,你有类似的bug很多地方,它们也能保持简单和习惯。

def gimme_things():
    if something_happens():
        return ['all', 'the', 'things']
    else:  # make sure we always return a list, no matter what!
        logging.info("Something didn't happen; return empty list")
        return []

当然,你把else:分支什么取决于你的使用情况。也许当something_happens()失败,你应该抛出一个异常,使之更加明显和明确一些地方实际上在哪里呢?例外添加到您自己的代码是为了让自己知道什么事情失败究竟是怎么回事的重要途径!

(还要注意如何修复后仍不能完全解决的bug - 它阻止你尝试下标Nonethings[0]仍时IndexError是一个空列表的things如果你有try你可以做except (TypeError, IndexError)捕获它。也。)

© www.soinside.com 2019 - 2024. All rights reserved.