'Return or set the pen\'s attributes.
Arguments:
pen -- a dictionary with some or all of the below listed keys.
**pendict -- one or more keyword-arguments with the below
listed keys as keywords.
Return or set the pen\'s attributes in a \'pen-dictionary\'
with the following key/value pairs:
"shown"      :   True/False
"pendown"    :   True/False
"pencolor"   :   color-string or color-tuple
"fillcolor"  :   color-string or color-tuple
"pensize"    :   positive number
"speed"      :   number in range 0..10
"resizemode" :   "auto" or "user" or "noresize"
"stretchfactor": (positive number, positive number)
"outline"    :   positive number
"tilt"       :   number
This dictionary can be used as argument for a subsequent
pen()-call to restore the former pen-state. Moreover one
or more of these attributes can be provided as keyword-arguments.
This can be used to set several pen attributes in one statement.
Examples (for a Turtle instance named turtle):
>>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
>>> turtle.pen()
{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,
\'pencolor\': \'red\', \'pendown\': True, \'fillcolor\': \'black\',
\'stretchfactor\': (1,1), \'speed\': 3}
>>> penstate=turtle.pen()
>>> turtle.color("yellow","")
>>> turtle.penup()
>>> turtle.pen()
{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,
\'pencolor\': \'yellow\', \'pendown\': False, \'fillcolor\': \'\',
\'stretchfactor\': (1,1), \'speed\': 3}
>>> p.pen(penstate, fillcolor="green")
>>> p.pen()
{\'pensize\': 10, \'shown\': True, \'resizemode\': \'auto\', \'outline\': 1,
\'pencolor\': \'red\', \'pendown\': True, \'fillcolor\': \'green\',
\'stretchfactor\': (1,1), \'speed\': 3}'

def pen(self, pen=None, **pendict):

    _pd = {'shown': self._shown, 'pendown': self._drawing, 'pencolor': self._pencolor, 'fillcolor': self._fillcolor, 'pensize': self._pensize, 'speed': self._speed, 'resizemode': self._resizemode, 'stretchfactor': self._stretchfactor, 'outline': self._outlinewidth, 'tilt': self._tilt}
    if (not (pen or pendict)):
        return _pd
    if isinstance(pen, dict):
        p = pen
    else:
        p = {}
    p.update(pendict)
    _p_buf = {}
    for key in p:
        _p_buf[key] = _pd[key]
    if self.undobuffer:
        self.undobuffer.push(('pen', _p_buf))
    newLine = False
    if ('pendown' in p):
        if (self._drawing != p['pendown']):
            newLine = True
    if ('pencolor' in p):
        if isinstance(p['pencolor'], tuple):
            p['pencolor'] = self._colorstr((p['pencolor'],))
        if (self._pencolor != p['pencolor']):
            newLine = True
    if ('pensize' in p):
        if (self._pensize != p['pensize']):
            newLine = True
    if newLine:
        self._newLine()
    if ('pendown' in p):
        self._drawing = p['pendown']
    if ('pencolor' in p):
        self._pencolor = p['pencolor']
    if ('pensize' in p):
        self._pensize = p['pensize']
    if ('fillcolor' in p):
        if isinstance(p['fillcolor'], tuple):
            p['fillcolor'] = self._colorstr((p['fillcolor'],))
        self._fillcolor = p['fillcolor']
    if ('speed' in p):
        self._speed = p['speed']
    if ('resizemode' in p):
        self._resizemode = p['resizemode']
    if ('stretchfactor' in p):
        sf = p['stretchfactor']
        if isinstance(sf, (int, float)):
            sf = (sf, sf)
        self._stretchfactor = sf
    if ('outline' in p):
        self._outlinewidth = p['outline']
    if ('shown' in p):
        self._shown = p['shown']
    if ('tilt' in p):
        self._tilt = p['tilt']
    self._update()
