def foo1():
  <weak_warning descr="Local variable 'aaa' value is not used">aaa</weak_warning> = 1 #fail
  <weak_warning descr="Local variable 'aaa' value is not used">aaa</weak_warning> = 2 #fail

  bbb = 1 #pass
  <weak_warning descr="Local variable 'bbb' value is not used">bbb</weak_warning> += 2 #fail

def bar(<weak_warning descr="Parameter 'self' value is not used">self</weak_warning>): #fail
  print("Foo")

def baz(<weak_warning descr="Parameter 'a' value is not used">a</weak_warning>): #fail
  a = 12
  print(a)

def boo():
  <weak_warning descr="Local variable 'k' value is not used">k</weak_warning> = 1 #fail
  [k for k in [1,3] if True]

  <weak_warning descr="Local variable 'i' value is not used">i</weak_warning> = 1 #fail
  for i in [1,2]:
    print(i)

  j = 1 #pass
  for j in [-2, -1]:
    print(j)
  print (j)

class A:
  def foo(self): #pass
    pass

def baa():
    foo.bar = 123 #pass

def bla(x): #pass
  def _bar():
    print x
  return _bar

def main():
  foo = "foo" #pass
  bar = "bar" #pass
  baz = "baz" #pass
  print "%(foo)s=%(bar)s" % locals()


def bar(arg): #pass
  foo = 1 #pass
  def <weak_warning descr="Local function 'test' is not used">test</weak_warning>(): #fail
    print arg
    return foo #pass

class FooBar:
    @classmethod
    def foo(cls): #pass
        pass
        args[0] = 123 # pass

def bzzz():
    for _ in xrange(1000): # pass
        pass

def do_something(local_var):
    global global_var
    global_var = local_var # pass

def srange(n):
    return {i for i in range(n)}

def test_func():
    return {(lambda i=py1208: i) for py1208 in range(5)}


def foo():
    status = None #pass
    try:
        status = open('/proc/self/status', 'r')
    finally:
        if status is not None:
            status.close()

foo  = lambda <weak_warning descr="Parameter 'x' value is not used">x</weak_warning>: False


class MySuperClass:
    def shazam(self, param1, param2): pass

class MySubClass(MySuperClass):
    def shazam(self, param1, param2): pass

def test_func():
    items = {(lambda i=i: i) for i in range(5)} #pass
    return {x() for x in items}

class MyType(type):
    def __new__(cls, name, bases, attrs):  #pass
        if name.startswith('None'):
            return None
        return super(MyType, cls).__new__(cls, name, bases, newattrs)

    def foo(cls): #fail
        pass

def test():
    d = dict()
    v = 1 #pass
    try:
        v = d['key']
    except KeyError:
        v = 2
    finally:
        print v

def foo(<weak_warning descr="Parameter 'a' value is not used">a = 123</weak_warning>): # fail Do not use getText() as parameter name
    print('hello')

def loopie():
    for x in range(5): pass
    for y in xrange(10): pass

def locals_inside():
    now = datetime.datetime.now() # pass
    do_smth_with(locals())

class Stat(object):
    @staticmethod
    def woof(<weak_warning descr="Parameter 'dog' value is not used">dog="bark"</weak_warning>): # fail
        print('hello')

class A:
    def __init__(self, *args): #pass
        self.args = []
        for a in args:
            self.args.append(a)


# PY-2574
def f():
    # x in "for" is actually used in "if"
    return [0 for x in range(10) if x] #pass


# PY-3031
def f():
    # n doesn't leak from the generator expression, so this n is used
    n = 1 #pass
    expr = (n for n in xrange(10))
    print n
    return expr


# PY-3118
def f(x):
    # Both y values in "if" can be used later in g, so the first one shouldn't be marked as unused
    if x:
        y = 0 #pass
    else:
        y = 1 #pass
    def g():
        return y
    return g


# PY-3076
def f():
    # Both x values could be used inside g (because there is no inter-procedural CFG)
    x = 'foo' #pass
    x = 'bar' #pass
    def g():
        return x
    x = 'baz' #pass
    return g


# PY-2418
def f(x):
    # The list shouldn't be marked as unused
    if isinstance(x, [tuple, list]): #pass
        pass


# PY-3550
def f():
    z = 2 #pass
    def g(z=z):
        return z
    return g


# PY-4151
def f(g):
    x = 1 #pass
    try:
        x = g()
    except Exception:
        pass
    else:
        pass
    print(x)


# PY-4154
def a1():
    <weak_warning descr="Local variable 'a' value is not used">a</weak_warning> = 1 #fail
    try:
        a = 2
    except Exception:
        a = 3
    print(a)


# PY-4157
def f(g):
    x = 1 #pass
    try:
        pass
    except Exception:
        pass
    else:
        x = g()
    print(x)


# PY-4147
def f(x, y, z):
    class C:
        foo = x #pass
        def h(self):
            return z
    def g():
        return y
    return C, g


# PY-4378
def f(c):
    try:
        x = c['foo']
    except KeyError:
        if c:
            x = 42 #pass
        else:
            raise
    except Exception:
        raise
    return x


# PY-5755
def test_same_named_variable_inside_class():
    a = 1 #pass
    class C:
        def a(self):
            print(a)
    return C


# PY-5086
def test_only_name_in_local_class():
    x = 1
    class <weak_warning descr="Local class 'C' is not used">C</weak_warning>:
        pass
    return x


# PY-7028
class C:
    def test_unused_params_in_empty_method_1(self, x, y, z):
        pass

    def test_unused_params_in_empty_method_2(self, x, y, z):
        raise Exception()

    def test_unused_params_in_empty_method_3(self, x, y, z):
        """Docstring."""

    def test_unused_params_in_empty_method_4(self, x, y, z):
        """Docstring."""
        raise Exception()

    def test_unused_params_in_empty_method_5(self, x, y, z):
        """Docstring."""
        return


# PY-7126
def test_unused_empty_function(<weak_warning descr="Parameter 'x' value is not used">x</weak_warning>):
    pass


# PY-7072
def test_unused_variable_in_cycle(x, c):
    while x > 0:
        x -= 1 #pass
        if c:
            break


# PY-7517
def test_unused_condition_local_with_last_if_in_cycle(c):
    x = True
    while x:
        x = False #pass
        if c:
            x = True


# PY-7527
def test_unused_empty_init_parameter():
    class C(object):
        def __init__(self, <weak_warning descr="Parameter 'foo' value is not used">foo</weak_warning>):
            pass

        def f(self, bar):
            pass

    return C

