Python 如何直接从元组中获取字符串?

Python 如何直接从元组中获取字符串?,python,python-2.7,Python,Python 2.7,是否直接从元组访问这四个值中的一个并存储它?这样我就可以创建一个类型为Card的新对象,然后将其设置为tuple中四个值中的一个 我想用一个字符串作为输入参数,例如myCard=Card(HEARTS)在您的类中,您需要在SUITS前面加上Card(或self)这样的前缀: class Card: def __init__(self, suit): self.suit = SUITS[suit] SUITS = ("HEARTS", "SPADES", "DIAM

是否直接从元组访问这四个值中的一个并存储它?这样我就可以创建一个类型为Card的新对象,然后将其设置为tuple中四个值中的一个


我想用一个字符串作为输入参数,例如myCard=Card(HEARTS)

在您的类中,您需要在
SUITS
前面加上
Card
(或
self
)这样的前缀:

class Card:
    def __init__(self, suit):
        self.suit = SUITS[suit]
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")

我不会费心去验证
suit
参数;如果提供了无效值
Card.SUITS[suit]
如果超出范围,将引发
索引器
;如果提供了非整数参数,将引发
类型错误
。如果您愿意,您可以捕获任一异常并提出自己的异常。

您可以根据诉讼进行验证。 如果给出的诉讼无效,您是否可以提出
ValueError

class Card:
    def __init__(self, suit):
        self.suit = Card.SUITS[suit]    # N.B. specify the class
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")

>>> for i in range(len(Card.SUITS)):
...     c = Card(i)
...     print(c.suit)
HEARTS
SPADES
DIAMONDS
CLUBS
现在可以通过以下方式创建实例:

class Card:
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")
    def __init__(self, suit):
        if suit not in self.SUITS:
             raise ValueError('invalid argument suit. must be: {}'.format(
                  ', '.join(self.SUITS)
             ))
        self.suit = suit
另一种方法是在此处使用:


如果要将
self.suit
赋值给给定的名称,如果该值在可接受的值中,则将其赋值给默认值

from enum import Enum
class Suits(Enum):
    HEARTS = 0
    SPADES = 1
    DIAMONDS = 2
    CLUBS = 3

class Card:
    def __init__(self, suit):
        assert(type(suit) is Suits)
        self.suit = suit

snurz = Card(Suits.CLUBS)
注:我同意@keksnicoh的方法(向上投票),这引发了一个例外

另一种方法是将默认值作为参数传递(显式优于隐式,记得吗?)


但是,您仍然应该检查默认值是否在可能的值中,并在此时引发和异常(或根据您的目标将其添加到这些值中)

您的意思是喜欢,
SUITS[2]
SUITS[3]
或其他什么?是的,但我想使用字符串作为输入参数,例如myCard=Card(HEARTS)你应该提到你想在你的
\uuuu init\uuuuu()
中接受字符串,或者你应该提供一个示例用法。class Card:def\uuuu init\uuuuuuuuuuu(self,suit):self.suit=Card.SUITS[SUITS]\N.B.为范围(len(Card.SUITS))中的i指定类SUITS=(“红桃”、“黑桃”、“钻石”、“梅花”):c=Card(“SPADES”)print(c.suit)我不确定,但它不起作用。你能给我一个例子吗?op在注释中指定,
\uuuuuu init\uuuu()
应该接受表示suit的字符串,使这个答案无效。@Mark:for循环就是示例用法。但是,正如我在前面的评论中所说的,这个答案由于额外的字符串参数要求而无效。有没有其他方法不抛出错误?e、 我更喜欢这样,因为我可以定义干净的消息,所以开发人员(包括我自己)可以得到一些提示,当出现问题时会发生什么(哪些有效值可用)。我不知道如果元素不在列表中,是否可以直接强制python引发异常。您可以这样做:
self.suit=dict({k:True代表self.SUITS中的k})[self.suit]
但是它有点加密,错误可能会误导您。您可以使用assert。看我的第二个例子。您也可以在第一个示例中使用它:
assert(suit in self.SUITS)
from enum import Enum
class Suits(Enum):
    HEARTS = 0
    SPADES = 1
    DIAMONDS = 2
    CLUBS = 3

class Card:
    def __init__(self, suit):
        assert(type(suit) is Suits)
        self.suit = suit

snurz = Card(Suits.CLUBS)
>>> class Card:
...     SUITS = {"HEARTS", "SPADES", "DIAMONDS", "CLUBS"} # you can still use the tuple if you prefer
...     def __init__(self, suit):
...         self.suit = suit if suit in self.SUITS else 'HEARTS' # default_value
... 
>>> c=Card('abc')
>>> c.suit
'HEARTS'
>>> c=Card('DIAMONDS')
>>> c.suit
'DIAMONDS'
>>> class Card:
...     SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")
...     def __init__(self, suit, default='HEARTS'):
...         self.suit = suit if suit in self.SUITS else default
... 
>>> c=Card('abc')
>>> c.suit
'HEARTS'
>>> c=Card('abc', 'DIAMONDS')
>>> c.suit
'DIAMONDS'