简体   繁体   English

Python @properties引发错误

[英]Python @properties raising an error

I am trying to write a class to pass the following unittest: 我正在尝试编写一个类来传递以下unittest:

import unittest
from property_address import *

class TestAddresses(unittest.TestCase): 

    def setUp(self): 
        self.home = Address( name='Steve Holden', street_address='1972 Flying Circus', city='Arlington', state='VA', zip_code='12345' )

    def test_name(self): 
        self.assertEqual(self.home.name, 'Steve Holden') 
        self.assertRaises(AttributeError, setattr, self.home, 'name', 'Daniel Greenfeld')  

    def test_state(self): 
        self.assertEqual(self.home.state, 'VA') 
        self.assertRaises(StateError, setattr, self.home, 'state', 'Not a state')  
        self.home.state = 'CO' 
        self.assertEqual(self.home.state, 'CO')  

The part I am having issues with is the self.assertRaises(StateError, setattr, self.home, 'state', 'Not a state') 我遇到问题的部分是self.assertRaises(StateError,setattr,self.home,'state','Not a state')

I can't seem how to get a StatError to be raised. 我似乎无法获得引发StatError的方法。

The code I am using is: 我使用的代码是:

class Address(object):

    states = ['IA', 'KS', 'UT', 'VA', 'NC', 'NE', 'SD', 'AL', 'ID', 'FM', 'DE', 'AK', 'CT', 'PR', 'NM', 'MS', 'PW', 'CO', 'NJ', 'FL', 'MN', 
              'VI', 'NV', 'AZ', 'WI', 'ND', 'PA', 'OK', 'KY', 'RI', 'NH', 'MO', 'ME', 'VT', 'GA', 'GU', 'AS', 'NY', 'CA', 'HI', 'IL', 'TN', 
              'MA', 'OH', 'MD', 'MI', 'WY', 'WA', 'OR', 'MH', 'SC', 'IN', 'LA', 'MP', 'DC', 'MT', 'AR', 'WV', 'TX']


    def __init__(self,name, street_address, city, state, zip_code):
        self._name = name
        self._street_address = street_address
        self._city = city
        self._state = state
        self._zip_code = zip_code


    @property
    def name(self):
        return self._name.title()

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self,value):
        if value in self.states:
            self._state = value
        else:
            raise ### This is where I am stuck

do I need to create a new @property for StateError, or should I work it into state def somehow. 我是否需要为StateError创建一个新的@property,或者我应该以某种方式将其用于状态def。

You need to raise a StateError exception; 您需要引发StateError异常; that is all: 就这些:

@state.setter
def state(self,value):
    if value not in self.states:
        raise StateError(value)
    self._state = value

This does require you to have defined the exception class first, of course: 这确实要求您首先定义异常类,当然:

class StateError(Exception):
    """Invalid state value used"""

Demo: 演示:

>>> class StateError(Exception): pass
... 
>>> class Address(object):
...     states = ['IA', 'KS', 'UT', 'VA', 'NC', 'NE', 'SD', 'AL', 'ID', 'FM', 'DE', 'AK', 'CT', 'PR', 'NM', 'MS', 'PW', 'CO', 'NJ', 'FL', 'MN', 
...               'VI', 'NV', 'AZ', 'WI', 'ND', 'PA', 'OK', 'KY', 'RI', 'NH', 'MO', 'ME', 'VT', 'GA', 'GU', 'AS', 'NY', 'CA', 'HI', 'IL', 'TN', 
...               'MA', 'OH', 'MD', 'MI', 'WY', 'WA', 'OR', 'MH', 'SC', 'IN', 'LA', 'MP', 'DC', 'MT', 'AR', 'WV', 'TX']...     @property
...     def state(self):
...         return self._state
...     @state.setter
...     def state(self,value):
...         if value not in self.states:
...             raise StateError(value)
...         self._state = value
...
>>> a = Address()
>>> a.state = 'VA'
>>> a.state = 'Nonesuch'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in state
__main__.StateError: Nonesuch

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM