哪些类型的对象分为“标化”的领域?
这基本上意味着对象实现__getitem__()
方法。换句话说,它描述了“容器”的对象,这意味着它们含有其他对象。这包括列表,元组和字典。
把我的头顶部,下面是唯一的内置插件是标化的:
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__
任何一类是标化
一个脚本化的对象是记录操作做它,它可以将它们保存为“脚本”,它可以重播的对象。
例如,请参阅:Application Scripting Framework
现在,如果阿利斯泰尔不知道他问什么,真正的意思是“标化”的对象(被别人当作编辑),然后(如mipadi还回答了),这是正确的:
一个可以脚标对象是实现__getitem__
特殊的方法(想想列表,字典)的任何对象。
在计算下标的意思是:“在程序中使用,单独或与他人,指定一个数组中的元素中的一个的符号(概念上写为一个下标,但在实践中通常不)”。
现在,通过@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”对象不是标化
我有同样的问题。我在做
arr = []
arr.append["HI"]
因此,使用[
是造成错误。它应该是arr.append("HI")
作为一个必然结果这里早先的答案,很多时候这是你认为你有一个清单(或字典,或其他标化的对象)时,你不这样做的迹象。
例如,假设你有这应该返回一个列表的功能;
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
对象不是标化”,因为,things
是None
,所以你正在尝试做的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 - 它阻止你尝试下标None
但things[0]
仍时IndexError
是一个空列表的things
如果你有try
你可以做except (TypeError, IndexError)
捕获它。也。)