Dict object has no attribute

Dict object has no attribute

In this post I want to list two common mistakes made by Python beginners:

  • AttributeError: ‘dict’ object has no attribute ‘name’
  • SyntaxError: invalid syntax

This can occur for creation of new or update/delete of existing value.

AttributeError: ‘dict’ object has no attribute ‘name’

This mistake can be seen if you try to set map value in wrong way and the dictionary has string as keys. This examples show the error and the right way to set a python dictionary value:

SyntaxError: invalid syntax

The next mistake is similar to the previous one. The only difference is that we are using as keys integer values. And this will end with different error like:

Note: If you want to set a default value in python dict you can do it as(to check if the value is not presented already in the map:

Affects Status Importance Assigned to Milestone
QBzr Edit
Status tracked in Trunk ​ 0.14

Bug Description

bzr: ERROR: exceptions. AttributeError: ‘dict’ object has no attribute ‘encode’

Traceback (most recent call last):
File "C:/Program Files/Bazaar/ plugins qbzrlib commit. py", line 664, in closeEvent
File "C:/Program Files/Bazaar/ plugins qbzrlib commit. py", line 659, in _save_or_ wipe_commit_ data
File "C:/Program Files/Bazaar/ plugins qbzrlib commit. py", line 565, in wipe_commit_data
File "C:/Program Files/Bazaar/ plugins qbzrlib commit_ data.py" , line 179, in wipe
File "bzrlib config. pyo", line 701, in set_user_option
File "bzrlib config. pyo", line 970, in set_option
File "bzrlib remote. pyo", line 2669, in set_option
AttributeError: ‘dict’ object has no attribute ‘encode’

bzr 2.0.0rc2 on python 2.5.4 (win32)
arguments: [‘C:\Program Files\ Bazaar zr.exe’ , ‘qcommit’, ‘—ui-mode’]
encoding: ‘cp1252’, fsenc: ‘mbcs’, lang: None
plugins:
bzrtools C:Program FilesBazaar plugins bzrtools [2.0.0]
explorer C:Program FilesBazaar plugins explorer [0.8.1]
extmerge C:Program FilesBazaar plugins extmerge [unknown]
launchpad C:Program FilesBazaar plugins launchpad [2.0.0rc2]
netrc_ credential_ store C:Program FilesBazaar plugins netrc_credentia l_store [2.0.0rc2]
qbzr C:Program FilesBazaar plugins qbzr [0.14.2]
rebase C:Program FilesBazaar plugins rebase [0.5.3]
svn C:Program FilesBazaar plugins svn [0.6.5]
upload C:Program FilesBazaar plugins upload [1.0.0dev]
xmloutput C:Program FilesBazaar plugins xmloutput [0.8.5]

Related branches

Tymek (maju7) wrote on 2009-09-21 : #1

This happen when committing 46 files.

Files with no special signs (all in english). Folders with spaces.

Tymek (maju7) wrote on 2009-09-21 : #2

Actually this happens now with any commit (1 file).

Bzr-explorer 0.8 in Windows

Bzr server in ubuntu.

I’m pretty sure this started happening with 2.0 RC1 and wasn’t happening and is also happening with 2.0 RC2 1.

Commits looks successful.

Tymek (maju7) wrote on 2009-09-21 : #3

C: est1>bzr add
adding b.txt

C: est1>bzr qcommit
Committing to: bzr://192. 168.56. 102:1234/ test1/
added b.txt
Committed revision 5.

The crash window is shown now (after "Committed revision 5")

C: est1>bzr add
adding c.txt

C: est1>bzr commit -m "Text"
Committing to: bzr://192. 168.56. 102:1234/ test1/
added c.txt
Committed revision 6.

This is quite obvious but the above (commit, not qcommit) doesn’t show any erros.

BTW. I don’t have TortoiseBzr installed.

Alexander Belchenko (bialix) wrote on 2009-09-21 : #4

Workaround: either don’t Cancel your commit, or use bound branches (heavyweight checkouts) instead of lightweight checkouts. Sorry, but actually the problem in bzr itself, see bug 430382.

Alexander Belchenko (bialix) wrote on 2009-09-21 : #5

Oh, you get error even on clean commit. Hmmm.
Perhaps we should not save commit data blindly if there is nothing to save.

Alexander Belchenko (bialix) wrote on 2009-09-21 : #6

Although this is clearly duplicate of bug 430382, but we can do better and avoid triggering this bug if there is no changes in commit_data.

Changed in qbzr:
assignee: nobody → Alexander Belchenko (bialix)
importance: Undecided → High
status: New → Confirmed
Tymek (maju7) wrote on 2009-09-21 : #7

Ok I’m confused about two things:

1. I’m not using cancel at all. The problem is shown during commits.
2. What do you mean by a clean commit. The example commit adds one file so it’s not an empty commit if this is what you mean.

Let me know if you need any more data.

Alexander Belchenko (bialix) wrote on 2009-09-21 : Re: [Bug 434034] Re: "’dict’ object has no attribute ‘encode’" error on commit #8

Tymek пишет:
> Ok I’m confused about two things:

Sorry, about this. I’ve mumbled to myself.

> 1. I’m not using cancel at all. The problem is shown during commits.
> 2. What do you mean by a clean commit. The example commit adds one file so it’s not an empty commit if this is what you mean.

I mean you have successful commit without any errors (clean).

> Let me know if you need any more data.

No, I understand where the problem lies.

You have only one workaround right now: use heavyweight checkout.
You can transform your current (lightweight) checkout to heavyweight with following command:

Читайте также:  Как сделать репост в одноклассниках через телефон

bzr reconfigure —checkout

I will try to fix original problem. Though I can’t promise it will be very fast.

Tymek (maju7) wrote on 2009-09-21 : #9

We are using the heavyweight checkouts if I understand things correctly.

server: bzr repo-init repo —no-trees
server: bzr init repo/trunk
client: branch trunk branch1(well we did it through bzr explorer so I guess bzr qbranch)
client: checkout branch1
client: bzr add
client: bzr qcommit

Anyway, the point I think is that the commits work and I guess you know where the problem is.

BTW. Hehe "Tymek пишет" 😉

Alexander Belchenko (bialix) wrote on 2009-09-22 : #10

Tymek пишет:
> We are using the heavyweight checkouts if I understand things correctly.

Please, show me the result of running following command in your local checkout:

You can edit sensitive paths if you wish, but keep intact other service information.

> Anyway, the point I think is that the commits work and I guess you know
> where the problem is.

I’m not sure now. If should not happens with heavyweight checkouts IIUC.

> BTW. Hehe "Tymek пишет" 😉

It’s "Tymek wrote" in Russian. Is it problem for you?

Alexander Belchenko (bialix) wrote on 2009-09-22 : #11

Tymek пишет:
> We are using the heavyweight checkouts if I understand things correctly.
>
> server: bzr repo-init repo —no-trees
> server: bzr init repo/trunk
> client: branch trunk branch1(well we did it through bzr explorer so I guess bzr qbranch)
> client: checkout branch1

If you created checkout via explorer then you got lightweight checkout, because explorer trying to
create light checkouts and call heavyweight checkouts as bound branches.

Alexander Belchenko (bialix) wrote on 2009-09-22 : #12

Alexander Belchenko пишет:
> Tymek пишет:
>> We are using the heavyweight checkouts if I understand things correctly.
>
> Please, show me the result of running following command in your local
> checkout:
>
> bzr info -v
>
> You can edit sensitive paths if you wish, but keep intact other service
> information.
>
>> Anyway, the point I think is that the commits work and I guess you know
>> where the problem is.
>
> I’m not sure now. If should not happens with heavyweight checkouts IIUC.

I’ve tried to reproduce this situation with simple bzr:// server running locally as

bzr serve —allow-writes —directory=.

and got normal commit with bound branch (heavyweight checkout) but error with lightweight checkout.
I suspect you actually have light checkout, so my workaround with reconfigure should help.

Tymek (maju7) wrote on 2009-09-22 : #13

>It’s "Tymek wrote" in Russian. Is it problem for you?
No, not at all — I’m Polish so I understood — It’s just cool to see somthing not it English on launchpad:)

>If you created checkout via explorer then you got lightweight checkout, because explorer trying to
create light checkouts

Yep, the checkouts were created with the explorer. Thanks for the info!

Tymek (maju7) wrote on 2009-09-22 : #14

After running bzr reconfigure —checkout I get:

c: est2>bzr reconfigure —checkout
bzr: ERROR: exceptions. AssertionError: bzrdir. BzrDirMeta1 object at 0x02
29B190> is not a RemoteBzrDir

Traceback (most recent call last):
File "bzrlib commands. pyo", line 842, in exception_ to_return_ code
File "bzrlib commands. pyo", line 1037, in run_bzr
File "bzrlib commands. pyo", line 654, in run_argv_aliases
File "bzrlib builtins. pyo", line 5330, in run
File "bzrlib reconfigure. pyo", line 332, in apply
File "bzrlib remote. pyo", line 501, in initialize
File "bzrlib remote. pyo", line 494, in _vfs_initialize
File "bzrlib remote. pyo", line 540, in open
AssertionError: bzrdir. BzrDirMeta1 object at 0x0229B190> is not a Remote
BzrDir

bzr 2.0rc2 on python 2.5.4 (Windows- Vista-6. 0.6001- SP1)
arguments: [‘bzr’, ‘reconfigure’, ‘—checkout’]
encoding: ‘cp1252’, fsenc: ‘mbcs’, lang: None
plugins:
bzrtools C:Program FilesBazaar plugins bzrtools [2.0]
explorer C:Program FilesBazaar plugins explorer [0.8.1]
extmerge C:Program FilesBazaar plugins extmerge [unknown]
launchpad C:Program FilesBazaar plugins launchpad [2.0rc2]
netrc_ credential_ store C:Program FilesBazaar plugins netrc_credentia l_store
[2.0rc2]
qbzr C:Program FilesBazaar plugins qbzr [0.14.2]
rebase C:Program FilesBazaar plugins rebase [0.5.3]
svn C:Program FilesBazaar plugins svn [0.6.5]
upload C:Program FilesBazaar plugins upload [1.0dev]
xmloutput C:Program FilesBazaar plugins xmloutput [0.8.5]

*** Bazaar has encountered an internal error. This probably indicates a
bug in Bazaar. You can help us fix it by filing a bug report at
https:/ /bugs.launchpad .net/bzr/ +filebug
including this traceback and a description of the problem.

To investigate a bit more I tried "reconfigure —checkout) on a heavyweight checkout too:
(all from command line)
c:>bzr checkout bzr://192. 168.168. 66:1234/ test2 c: est3

c:>cd test3
c: est3>bzr reconfigure —lightweight- checkout

c: est3>bzr reconfigure —checkout
bzr: ERROR: exceptions. AssertionError: bzrdir. BzrDirMeta1 object at 0x0229B190> is not a RemoteBzrDir

Traceback (most recent call last):
(. )

1. Do you want a new bug for this?

2. As for the original qcommit problem we’ll just create new checkouts with the command line for now.

Читайте также:  Картины в высоком разрешении знаменитых художников
Alexander Belchenko (bialix) wrote on 2009-09-22 : #15

Tymek пишет:
> Hm.
>
> After running bzr reconfigure —checkout I get:
>
> c: est2>bzr reconfigure —checkout
> bzr: ERROR: exceptions. AssertionError: bzrdir. BzrDirMeta1 object at 0x02
> 29B190> is not a RemoteBzrDir
>
> Traceback (most recent call last):
> File "bzrlib commands. pyo", line 842, in exception_ to_return_ code
> File "bzrlib commands. pyo", line 1037, in run_bzr
> File "bzrlib commands. pyo", line 654, in run_argv_aliases
> File "bzrlib builtins. pyo", line 5330, in run
> File "bzrlib reconfigure. pyo", line 332, in apply
> File "bzrlib remote. pyo", line 501, in initialize
> File "bzrlib remote. pyo", line 494, in _vfs_initialize
> File "bzrlib remote. pyo", line 540, in open
> AssertionError: bzrdir. BzrDirMeta1 object at 0x0229B190> is not a Remote
> BzrDir

I suspect this is regression in core bzr.

> 1. Do you want a new bug for this?

Yes, please, a matter of urgency, file a bug against bzr project.

Alexander Belchenko (bialix) wrote on 2009-09-22 : #16

Tymek пишет:
> Hm.
>
> After running bzr reconfigure —checkout I get:
>
> c: est2>bzr reconfigure —checkout
> bzr: ERROR: exceptions. AssertionError: bzrdir. BzrDirMeta1 object at 0x02
> 29B190> is not a RemoteBzrDir

Workaround for this error:

bzr reconfigure —tree
bzr bind URL/to/ master/ branch

Ken Tang (ktlb) wrote on 2009-10-28 : #17

This problem also happening in Bazaar 2.0.0-2 with Bazaar Explorer 0.8.2

Matteo Settenvini (tchernobog) wrote on 2009-10-30 : #18

I can confirm this happening on at least 3 different Windows machines. I’m using this to commit to a Samba share on an Ubuntu machine, but that should be transparent for bazaar, I think.

Несколько заметок об объектной системе python’a. Рассчитаны на тех, кто уже умеет программировать на python. Речь идет только о новых классах (new-style classes) в python 2.3 и выше. В этой статье рассказывается, что такое объекты и как происходит поиск атрибутов.

Объекты

Все данные в питоне — это объекты. Каждый объект имеет 2 специальных атрибута __class__ и __dict__.

  • __class__ — определяет класс или тип, экзмепляром которого является объект. Тип (или класс объекта) определяет его поведение; он есть у всех объектов, в том числе и встроенных. Тип и класс — это разные названия одного и того же. x.__class__ type(x).
  • __dict__ словарь, дающий доступ к внутреннему пространству имен, он есть почти у всех объектов, у многих встроенных типов его нет.

Примеры.

>>> def foo (): pass
.
>>> foo . __class__

>>> foo . __dict__
<>
>>> ( 42 ) . __dict__
Traceback (most recent call last):
File " ", line 1, in
AttributeError: ‘int’ object has no attribute ‘__dict__’
>>> ( 42 ) . __class__

>>> class A ( object ):
. qux = ‘A’
. def __init__ ( self , name):
. self . name = name
. def foo ( self ):
. print ‘foo’
.
>>> a = A( ‘a’ )

У a тоже есть __dict__ и __class__:

>>> a . __dict__ <‘name’: ‘a’>
>>> a . __class__

>>> type (a)

>>> a . __class__ is type (a)
True

Класс и тип — это одно и то же.

>>> a . __class__ is type (a) is A
True

a.__dict__ — это словарь, в котором находятся внутренние (или специфичные для объекта) атрибуты, в данном случае ‘name’. А в a.__class__ класс (тип).

И, например, в методах класса присваивание self.foo = bar практически идентично self.__dict__[‘foo’] = bar или сводится к аналогичному вызову.

В __dict__ объекта нет методов класса, дескрипторов, классовых переменных, свойств, статических методов класса, все они определяются динамически с помощью класса из __class__ атрибута, и являются специфичными именно для класса (типа) объекта, а не для самого объекта.

Пример. Переопределим класс объекта a:

>>> class B ( object ):
. qux = ‘B’
. def __init__ ( self ):
. self . name = ‘B object’
. def bar ( self ):
. print ‘bar’
.
>>> a . __dict__
<‘name’: ‘a’>
>>> a . foo()
foo
>>> a . __class__

>>> a . __class__ = B
>>> a . __class__

Смотрим, что поменялось.

Значение a.name осталось прежним, т.е. __init__ не вызывался при смене класса.

>>> a . __dict__
<‘name’: ‘a’>
Доступ к классовым переменным и методам «прошлого» класса A пропал:
>>> a . foo()
Traceback (most recent call last):
File " ", line 1, in
AttributeError: ‘B’ object has no attribute ‘foo’
А вот классовые переменные и методы класса B доступы:
>>> a . bar()
bar
>>> a . qux
‘B’

Работа с атрибутам объекта: установка, удаление и поиск, равносильна вызову встроенных функций settattr, delattr, getattr:

a.x = 1 setattr(a, ‘x’, 1)
del a.x delattr(a, ‘x’)
a.x getattr(a, ‘x’)

При этом стоит стоит понимать, что setattr и delattr влияют и изменяют только сам объект (точнее a.__dict__), и не изменяют класс объекта.

qux — является классовой переменной, т.е. она «принадлежит» классу B, а не объекту a:

>>> a . qux
‘B’
>>> a . __dict__

Если мы попытаемся удалить этот атрибут, то получим ошибку, т.к. delattr будет пытаться удалить атрибут из a.__dict__

>>> delattr (a, ‘qux’ )
Traceback (most recent call last):
File " ", line 1, in
AttributeError: qux
>>> del a . qux
Traceback (most recent call last):
File " ", line 1, in
AttributeError: qux
>>> a . qux
‘B’
>>>

Читайте также:  Как сделать скриншот в инстаграме на айфоне

Далее, если мы попытаемся изменить (установить) атрибут, setattr поместит его в __dict__, специфичный для данного, конкретного объекта.

>>> b = B()
>>> b . qux
‘B’
>>> a . qux = ‘myB’
>>> a . qux
‘myB’
>>> a . __dict__
<‘qux’: ‘myB’, ‘name’: ‘a’>
>>> b . qux
‘B’
>>>

Ну и раз есть ‘qux’ в __dict__ объекта, его можно удалить с помощью delattr:

>>> del a . qux

После удаления, a.qux будет возвращать значение классовой переменной:

>>> a . qux
‘B’
>>> a . __dict__

Итак:

  • класс для объекта — это значение специального атрибута __class__ и его можно менять. (Хотя в официальной документации говорится, что никаких гарантий нет, но на самом деле можно)
  • почти каждый объект имеет свое пространство имен (атрибутов), доступ (не всегда полный), к которому осуществляется с помощью специального атрибута __dict__
  • класс фактичеки влияет только на поиск атрибутов, которых нет в __dict__, как-то: методы класса, дескрипторы, магические методы, классовые переменные и прочее.

Объекты и классы

Классы — это объекты, и у них тоже есть специальные атрибуты __class__ и __dict__.

>>> class A ( object ):
. pass
.

У класса тип type.

>>> A . __class__

Правда __dict__ у классов не совсем словарь

>>> A . __dict__

Но __dict__ ответственен за доступ к внутреннему пространству имен, в котором хранятся методы, дескрипторы, переменные, свойства и прочее:

В классах помимо __class__ и __dict__, имеется еще несколько специальных атрибутов: __bases__ — список прямых родителей, __name__ — имя класса. [1]

Классы можно считать эдакими расширениями обычных объектов, которые реализуют интерфейс типа. Множество всех классов (или типов) принадлежат множеству всех объектов, а точнее является его подмножеством. Иначе говоря, любой класс является объектом, но не всякий объект является классом. Договоримся называть обычными объектами(regular objects) те объекты, которые классами не являются.

Небольшая демонстрация, которая станет лучше понятна чуть позже.
Класс является объектом.
>>> class A ( object ):
. pass
.

>>> isinstance (A, object )
True

Число — это тоже объект.

>>> isinstance ( 42 , object )
True

Класс — это класс (т.е. тип).

>>> isinstance (A, type )
True

А вот число классом (типом) не является. (Что такое type будет пояснено позже)

>>> isinstance ( 42 , type )
False
>>>

Ну и a — тоже обычный объект.

>>> a = A()
>>> isinstance (a, A)
True
>>> isinstance (a, object )
True
>>> isinstance (a, type )
False

И у A всего один прямой родительский класс — object.

>>> A . __bases__
( ,)

Часть специальных параметров можно даже менять:

>>> A . __name__
‘A’
>>> A . __name__ = ‘B’
>>> A

С помощью getattr получаем доступ к атрибутам класса:

>>> A . qux
‘A’
>>> A . foo

>>>

Поиск атрибутов в обычном объекте

В первом приближении алгоритм поиска выглядит так: сначала ищется в __dict__ объекта, потом идет поиск по __dict__ словарям класса объекта (который определяется с помощью __class__) и __dict__ его базовых классов в рекурсивном порядке.

>>> class A ( object ):
. qux = ‘A’
. def __init__ ( self , name):
. self . name = name
. def foo ( self ):
. print ‘foo’
.
>>> a = A()
>>> b = A()

Т.к. в обычных объектах a и b нет в __dict__ атрибута ‘qux’, то поиск продолжается во внутреннем словаре __dict__ их типа (класса), а потом по __dict__ словарям родителей в определенном порядке:

>>> b . qux
‘A’
>>> A . qux
‘A’

Меняем атрибут qux у класса A. И соответственно должны поменяться значения, которые возвращают экземпляры класса A — a и b:

>>> A . qux = ‘B’
>>> a . qux
‘B’
>>> b . qux
‘B’
>>>

Точно так же в рантайме к классу можно добавить метод:

>>> A . quux = lambda self : ‘i have quux method’
>>> A . __dict__[ ‘quux’ ]
at 0x7f7797a25b90>
>>> A . quux
>

И доступ к нему появится у экземпляров:

>>> a . quux()
‘i have quux method’

Точно так же как и с любыми другими объектами, можно удалить атрибут класса, например, классовую переменную qux:

>>> del A . qux

Она удалиться из __dict__

>>> A . __dict__[ ‘qux’ ]
Traceback (most recent call last):
File " ", line 1, in
KeyError: ‘qux’

И доступ у экземляров пропадет.

>>> a . qux
Traceback (most recent call last):
File " ", line 1, in
AttributeError: ‘A’ object has no attribute ‘qux’
>>>

У классов почти такой же поиск атрибутов, как и у обычных объектов, но есть отличия: поиск начинается с собственного __dict__ словаря, а потом идет поиск по __dict__ словарям суперклассов (которые хранятся в __bases__) по опредленному алгоритму, а затем по классу в __class__ и его суперклассах. (Подробнее об этом позже).

Cсылки

  • Unifying types and classes in Python — главный документ, объясняющий что, как и зачем в новых классах.
  • Making Types Look More Like Classes — PEP 252, описывающий отличие старых классов от новых.
  • Built-in functions — детальное описание работы всех встроенных функций.
  • Data model — детальное описание модели данных python’а.
  • Python types and objects — объяснение объектной модели python на простых примерах с картинками.

Примечания

[1] О __module__ и __doc__ для простоты изложения пока забудем. Полный список атрибутов класса можно посмотреть в документации

Ссылка на основную публикацию
Bq strike power 5000
Компания BQ Mobile объявила о начале продаж в России нового недорогого смартфона BQ-5059 Strike Power. Ключевой особенностью новинки стал аккумулятор...
Adblock detector