Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
c8088df3
Kaydet (Commit)
c8088df3
authored
Şub 02, 2008
tarafından
Georg Brandl
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Rewrite test_funcattrs as unittest, written for GHOP by Jeff Wheeler.
üst
4854552f
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
280 additions
and
413 deletions
+280
-413
test_funcattrs.py
Lib/test/test_funcattrs.py
+280
-413
No files found.
Lib/test/test_funcattrs.py
Dosyayı görüntüle @
c8088df3
from
test
.test_support
import
verbose
,
TestFailed
,
verify
from
test
import
test_support
import
types
import
types
import
unittest
class
F
:
def
a
(
self
):
def
cannot_set_attr
(
obj
,
name
,
value
,
exceptions
):
pass
# This method is not called as a test (name doesn't start with 'test'),
# but may be used by other tests.
def
b
():
try
:
setattr
(
obj
,
name
,
value
)
'my docstring'
except
exceptions
:
pass
pass
else
:
self
.
fail
(
"shouldn't be able to set
%
s to
%
r"
%
(
name
,
value
))
try
:
delattr
(
obj
,
name
)
# __module__ is a special attribute
except
exceptions
:
pass
verify
(
b
.
__module__
==
__name__
)
else
:
self
.
fail
(
"shouldn't be able to del
%
s"
%
name
)
verify
(
verify
.
__module__
==
"test.test_support"
)
class
FuncAttrsTest
(
unittest
.
TestCase
):
# setting attributes on functions
def
setUp
(
self
):
try
:
class
F
:
b
.
publish
def
a
(
self
):
except
AttributeError
:
pass
pass
else
:
raise
TestFailed
,
'expected AttributeError'
def
b
():
return
3
if
b
.
__dict__
<>
{}:
self
.
f
=
F
raise
TestFailed
,
'expected unassigned func.__dict__ to be {}'
self
.
fi
=
F
()
self
.
b
=
b
b
.
publish
=
1
if
b
.
publish
<>
1
:
class
FunctionPropertiesTest
(
FuncAttrsTest
):
raise
TestFailed
,
'function attribute not set to expected value'
# Include the external setUp method that is common to all tests
def
test_module
(
self
):
docstring
=
'its docstring'
self
.
assertEqual
(
self
.
b
.
__module__
,
__name__
)
b
.
__doc__
=
docstring
if
b
.
__doc__
<>
docstring
:
def
test_dir_includes_correct_attrs
(
self
):
raise
TestFailed
,
'problem with setting __doc__ attribute'
self
.
b
.
known_attr
=
7
self
.
assert_
(
'known_attr'
in
dir
(
self
.
b
),
if
'publish'
not
in
dir
(
b
):
"set attributes not in dir listing of method"
)
raise
TestFailed
,
'attribute not in dir()'
# Test on underlying function object of method
self
.
f
.
a
.
im_func
.
known_attr
=
7
try
:
self
.
assert_
(
'known_attr'
in
dir
(
self
.
f
.
a
),
del
b
.
__dict__
"set attribute on unbound method implementation in class not in "
except
TypeError
:
pass
"dir"
)
else
:
raise
TestFailed
,
'del func.__dict__ expected TypeError'
self
.
assert_
(
'known_attr'
in
dir
(
self
.
fi
.
a
),
"set attribute on unbound method implementations, should show up"
b
.
publish
=
1
" in next dir"
)
try
:
b
.
__dict__
=
None
def
test_duplicate_function_equality
(
self
):
except
TypeError
:
pass
# Body of `duplicate' is the exact same as self.b
else
:
raise
TestFailed
,
'func.__dict__ = None expected TypeError'
def
duplicate
():
'my docstring'
d
=
{
'hello'
:
'world'
}
return
3
b
.
__dict__
=
d
self
.
assertNotEqual
(
self
.
b
,
duplicate
)
if
b
.
func_dict
is
not
d
:
raise
TestFailed
,
'func.__dict__ assignment to dictionary failed'
def
test_copying_func_code
(
self
):
if
b
.
hello
<>
'world'
:
def
test
():
pass
raise
TestFailed
,
'attribute after func.__dict__ assignment failed'
self
.
assertEqual
(
test
(),
None
)
test
.
func_code
=
self
.
b
.
func_code
f1
=
F
()
self
.
assertEqual
(
test
(),
3
)
# self.b always returns 3, arbitrarily
f2
=
F
()
def
test_func_globals
(
self
):
try
:
self
.
assertEqual
(
self
.
b
.
func_globals
,
globals
())
F
.
a
.
publish
cannot_set_attr
(
self
.
b
,
'func_globals'
,
2
,
TypeError
)
except
AttributeError
:
pass
else
:
raise
TestFailed
,
'expected AttributeError'
def
test_func_name
(
self
):
self
.
assertEqual
(
self
.
b
.
__name__
,
'b'
)
try
:
self
.
assertEqual
(
self
.
b
.
func_name
,
'b'
)
f1
.
a
.
publish
self
.
b
.
__name__
=
'c'
except
AttributeError
:
pass
self
.
assertEqual
(
self
.
b
.
__name__
,
'c'
)
else
:
raise
TestFailed
,
'expected AttributeError'
self
.
assertEqual
(
self
.
b
.
func_name
,
'c'
)
self
.
b
.
func_name
=
'd'
# In Python 2.1 beta 1, we disallowed setting attributes on unbound methods
self
.
assertEqual
(
self
.
b
.
__name__
,
'd'
)
# (it was already disallowed on bound methods). See the PEP for details.
self
.
assertEqual
(
self
.
b
.
func_name
,
'd'
)
try
:
# __name__ and func_name must be a string
F
.
a
.
publish
=
1
cannot_set_attr
(
self
.
b
,
'__name__'
,
7
,
TypeError
)
except
(
AttributeError
,
TypeError
):
pass
cannot_set_attr
(
self
.
b
,
'func_name'
,
7
,
TypeError
)
else
:
raise
TestFailed
,
'expected AttributeError or TypeError'
# __name__ must be available when in restricted mode. Exec will raise
# AttributeError if __name__ is not available on f.
# But setting it explicitly on the underlying function object is okay.
s
=
"""def f(): pass
\n
f.__name__"""
F
.
a
.
im_func
.
publish
=
1
exec
s
in
{
'__builtins__'
:
{}}
# Test on methods, too
if
F
.
a
.
publish
<>
1
:
self
.
assertEqual
(
self
.
f
.
a
.
__name__
,
'a'
)
raise
TestFailed
,
'unbound method attribute not set to expected value'
self
.
assertEqual
(
self
.
fi
.
a
.
__name__
,
'a'
)
cannot_set_attr
(
self
.
f
.
a
,
"__name__"
,
'a'
,
AttributeError
)
if
f1
.
a
.
publish
<>
1
:
cannot_set_attr
(
self
.
fi
.
a
,
"__name__"
,
'a'
,
AttributeError
)
raise
TestFailed
,
'bound method attribute access did not work'
def
test_func_code
(
self
):
if
f2
.
a
.
publish
<>
1
:
num_one
,
num_two
=
7
,
8
raise
TestFailed
,
'bound method attribute access did not work'
def
a
():
pass
def
b
():
return
12
if
'publish'
not
in
dir
(
F
.
a
):
def
c
():
return
num_one
raise
TestFailed
,
'attribute not in dir()'
def
d
():
return
num_two
def
e
():
return
num_one
,
num_two
try
:
for
func
in
[
a
,
b
,
c
,
d
,
e
]:
f1
.
a
.
publish
=
0
self
.
assertEqual
(
type
(
func
.
func_code
),
types
.
CodeType
)
except
(
AttributeError
,
TypeError
):
pass
self
.
assertEqual
(
c
(),
7
)
else
:
raise
TestFailed
,
'expected AttributeError or TypeError'
self
.
assertEqual
(
d
(),
8
)
d
.
func_code
=
c
.
func_code
# See the comment above about the change in semantics for Python 2.1b1
self
.
assertEqual
(
c
.
func_code
,
d
.
func_code
)
try
:
self
.
assertEqual
(
c
(),
7
)
F
.
a
.
myclass
=
F
# self.assertEqual(d(), 7)
except
(
AttributeError
,
TypeError
):
pass
try
:
b
.
func_code
=
c
.
func_code
else
:
raise
TestFailed
,
'expected AttributeError or TypeError'
except
ValueError
:
pass
else
:
self
.
fail
(
F
.
a
.
im_func
.
myclass
=
F
"func_code with different numbers of free vars should not be "
"possible"
)
f1
.
a
.
myclass
try
:
e
.
func_code
=
d
.
func_code
f2
.
a
.
myclass
except
ValueError
:
pass
f1
.
a
.
myclass
else
:
self
.
fail
(
F
.
a
.
myclass
"func_code with different numbers of free vars should not be "
"possible"
)
if
f1
.
a
.
myclass
is
not
f2
.
a
.
myclass
or
\
f1
.
a
.
myclass
is
not
F
.
a
.
myclass
:
def
test_blank_func_defaults
(
self
):
raise
TestFailed
,
'attributes were not the same'
self
.
assertEqual
(
self
.
b
.
func_defaults
,
None
)
del
self
.
b
.
func_defaults
# try setting __dict__
self
.
assertEqual
(
self
.
b
.
func_defaults
,
None
)
try
:
F
.
a
.
__dict__
=
(
1
,
2
,
3
)
def
test_func_default_args
(
self
):
except
(
AttributeError
,
TypeError
):
pass
def
first_func
(
a
,
b
):
else
:
raise
TestFailed
,
'expected TypeError or AttributeError'
return
a
+
b
def
second_func
(
a
=
1
,
b
=
2
):
F
.
a
.
im_func
.
__dict__
=
{
'one'
:
11
,
'two'
:
22
,
'three'
:
33
}
return
a
+
b
self
.
assertEqual
(
first_func
.
func_defaults
,
None
)
if
f1
.
a
.
two
<>
22
:
self
.
assertEqual
(
second_func
.
func_defaults
,
(
1
,
2
))
raise
TestFailed
,
'setting __dict__'
first_func
.
func_defaults
=
(
1
,
2
)
self
.
assertEqual
(
first_func
.
func_defaults
,
(
1
,
2
))
from
UserDict
import
UserDict
self
.
assertEqual
(
first_func
(),
3
)
d
=
UserDict
({
'four'
:
44
,
'five'
:
55
})
self
.
assertEqual
(
first_func
(
3
),
5
)
self
.
assertEqual
(
first_func
(
3
,
5
),
8
)
try
:
del
second_func
.
func_defaults
F
.
a
.
__dict__
=
d
self
.
assertEqual
(
second_func
.
func_defaults
,
None
)
except
(
AttributeError
,
TypeError
):
pass
try
:
second_func
()
else
:
raise
TestFailed
except
TypeError
:
pass
else
:
self
.
fail
(
if
f2
.
a
.
one
<>
f1
.
a
.
one
<>
F
.
a
.
one
<>
11
:
"func_defaults does not update; deleting it does not remove "
raise
TestFailed
"requirement"
)
# im_func may not be a Python method!
class
ImplicitReferencesTest
(
FuncAttrsTest
):
import
types
def
test_im_class
(
self
):
F
.
id
=
types
.
MethodType
(
id
,
None
,
F
)
self
.
assertEqual
(
self
.
f
.
a
.
im_class
,
self
.
f
)
self
.
assertEqual
(
self
.
fi
.
a
.
im_class
,
self
.
f
)
eff
=
F
()
cannot_set_attr
(
self
.
f
.
a
,
"im_class"
,
self
.
f
,
TypeError
)
if
eff
.
id
()
<>
id
(
eff
):
cannot_set_attr
(
self
.
fi
.
a
,
"im_class"
,
self
.
f
,
TypeError
)
raise
TestFailed
def
test_im_func
(
self
):
try
:
self
.
f
.
b
=
self
.
b
F
.
id
.
foo
self
.
assertEqual
(
self
.
f
.
b
.
im_func
,
self
.
b
)
except
AttributeError
:
pass
self
.
assertEqual
(
self
.
fi
.
b
.
im_func
,
self
.
b
)
else
:
raise
TestFailed
cannot_set_attr
(
self
.
f
.
b
,
"im_func"
,
self
.
b
,
TypeError
)
cannot_set_attr
(
self
.
fi
.
b
,
"im_func"
,
self
.
b
,
TypeError
)
try
:
F
.
id
.
foo
=
12
def
test_im_self
(
self
):
except
(
AttributeError
,
TypeError
):
pass
self
.
assertEqual
(
self
.
f
.
a
.
im_self
,
None
)
else
:
raise
TestFailed
self
.
assertEqual
(
self
.
fi
.
a
.
im_self
,
self
.
fi
)
cannot_set_attr
(
self
.
f
.
a
,
"im_self"
,
None
,
TypeError
)
try
:
cannot_set_attr
(
self
.
fi
.
a
,
"im_self"
,
self
.
fi
,
TypeError
)
F
.
id
.
foo
except
AttributeError
:
pass
def
test_im_func_non_method
(
self
):
else
:
raise
TestFailed
# Behavior should be the same when a method is added via an attr
# assignment
try
:
self
.
f
.
id
=
types
.
MethodType
(
id
,
None
,
self
.
f
)
eff
.
id
.
foo
self
.
assertEqual
(
self
.
fi
.
id
(),
id
(
self
.
fi
))
except
AttributeError
:
pass
self
.
assertNotEqual
(
self
.
fi
.
id
(),
id
(
self
.
f
))
else
:
raise
TestFailed
# Test usage
try
:
self
.
f
.
id
.
unknown_attr
try
:
except
AttributeError
:
pass
eff
.
id
.
foo
=
12
else
:
self
.
fail
(
"using unknown attributes should raise AttributeError"
)
except
(
AttributeError
,
TypeError
):
pass
# Test assignment and deletion
else
:
raise
TestFailed
cannot_set_attr
(
self
.
f
.
id
,
'unknown_attr'
,
2
,
AttributeError
)
cannot_set_attr
(
self
.
fi
.
id
,
'unknown_attr'
,
2
,
AttributeError
)
try
:
eff
.
id
.
foo
def
test_implicit_method_properties
(
self
):
except
AttributeError
:
pass
self
.
f
.
a
.
im_func
.
known_attr
=
7
else
:
raise
TestFailed
self
.
assertEqual
(
self
.
f
.
a
.
known_attr
,
7
)
self
.
assertEqual
(
self
.
fi
.
a
.
known_attr
,
7
)
# Regression test for a crash in pre-2.1a1
def
another
():
class
ArbitraryFunctionAttrTest
(
FuncAttrsTest
):
pass
def
test_set_attr
(
self
):
self
.
b
.
known_attr
=
7
try
:
self
.
assertEqual
(
self
.
b
.
known_attr
,
7
)
del
another
.
__dict__
for
func
in
[
self
.
f
.
a
,
self
.
fi
.
a
]:
except
TypeError
:
pass
try
:
func
.
known_attr
=
7
else
:
raise
TestFailed
except
AttributeError
:
pass
else
:
self
.
fail
(
"setting attributes on methods should raise error"
)
try
:
del
another
.
func_dict
def
test_delete_unknown_attr
(
self
):
except
TypeError
:
pass
try
:
del
self
.
b
.
unknown_attr
else
:
raise
TestFailed
except
AttributeError
:
pass
else
:
self
.
fail
(
"deleting unknown attribute should raise TypeError"
)
try
:
another
.
func_dict
=
None
def
test_setting_attrs_duplicates
(
self
):
except
TypeError
:
pass
try
:
self
.
f
.
a
.
klass
=
self
.
f
else
:
raise
TestFailed
except
AttributeError
:
pass
else
:
self
.
fail
(
"setting arbitrary attribute in unbound function "
try
:
" should raise AttributeError"
)
del
another
.
bar
self
.
f
.
a
.
im_func
.
klass
=
self
.
f
except
AttributeError
:
pass
for
method
in
[
self
.
f
.
a
,
self
.
fi
.
a
,
self
.
fi
.
a
.
im_func
]:
else
:
raise
TestFailed
self
.
assertEqual
(
method
.
klass
,
self
.
f
)
# This isn't specifically related to function attributes, but it does test a
def
test_unset_attr
(
self
):
# core dump regression in funcobject.c
for
func
in
[
self
.
b
,
self
.
f
.
a
,
self
.
fi
.
a
]:
del
another
.
func_defaults
try
:
func
.
non_existant_attr
except
AttributeError
:
pass
def
foo
():
else
:
self
.
fail
(
"using unknown attributes should raise "
pass
"AttributeError"
)
def
bar
():
class
FunctionDictsTest
(
FuncAttrsTest
):
pass
def
test_setting_dict_to_invalid
(
self
):
cannot_set_attr
(
self
.
b
,
'__dict__'
,
None
,
TypeError
)
def
temp
():
cannot_set_attr
(
self
.
b
,
'func_dict'
,
None
,
TypeError
)
print
1
from
UserDict
import
UserDict
d
=
UserDict
({
'known_attr'
:
7
})
if
foo
==
bar
:
cannot_set_attr
(
self
.
f
.
a
.
im_func
,
'__dict__'
,
d
,
TypeError
)
raise
TestFailed
cannot_set_attr
(
self
.
fi
.
a
.
im_func
,
'__dict__'
,
d
,
TypeError
)
d
=
{}
def
test_setting_dict_to_valid
(
self
):
d
[
foo
]
=
1
d
=
{
'known_attr'
:
7
}
self
.
b
.
__dict__
=
d
foo
.
func_code
=
temp
.
func_code
# Setting dict is only possible on the underlying function objects
self
.
f
.
a
.
im_func
.
__dict__
=
d
d
[
foo
]
# Test assignment
self
.
assertEqual
(
d
,
self
.
b
.
__dict__
)
# Test all predefined function attributes systematically
self
.
assertEqual
(
d
,
self
.
b
.
func_dict
)
# ... and on all the different ways of referencing the method's func
def
cantset
(
obj
,
name
,
value
,
exception
=
(
AttributeError
,
TypeError
)):
self
.
assertEqual
(
d
,
self
.
f
.
a
.
im_func
.
__dict__
)
verify
(
hasattr
(
obj
,
name
))
# Otherwise it's probably a typo
self
.
assertEqual
(
d
,
self
.
f
.
a
.
__dict__
)
try
:
self
.
assertEqual
(
d
,
self
.
fi
.
a
.
im_func
.
__dict__
)
setattr
(
obj
,
name
,
value
)
self
.
assertEqual
(
d
,
self
.
fi
.
a
.
__dict__
)
except
exception
:
# Test value
pass
self
.
assertEqual
(
self
.
b
.
known_attr
,
7
)
else
:
self
.
assertEqual
(
self
.
b
.
__dict__
[
'known_attr'
],
7
)
raise
TestFailed
,
"shouldn't be able to set
%
s to
%
r"
%
(
name
,
value
)
self
.
assertEqual
(
self
.
b
.
func_dict
[
'known_attr'
],
7
)
try
:
# ... and again, on all the different method's names
delattr
(
obj
,
name
)
self
.
assertEqual
(
self
.
f
.
a
.
im_func
.
known_attr
,
7
)
except
(
AttributeError
,
TypeError
):
self
.
assertEqual
(
self
.
f
.
a
.
known_attr
,
7
)
pass
self
.
assertEqual
(
self
.
fi
.
a
.
im_func
.
known_attr
,
7
)
else
:
self
.
assertEqual
(
self
.
fi
.
a
.
known_attr
,
7
)
raise
TestFailed
,
"shouldn't be able to del
%
s"
%
name
def
test_delete_func_dict
(
self
):
def
test_func_closure
():
try
:
del
self
.
b
.
__dict__
a
=
12
except
TypeError
:
pass
def
f
():
print
a
else
:
self
.
fail
(
"deleting function dictionary should raise TypeError"
)
c
=
f
.
func_closure
try
:
del
self
.
b
.
func_dict
verify
(
isinstance
(
c
,
tuple
))
except
TypeError
:
pass
verify
(
len
(
c
)
==
1
)
else
:
self
.
fail
(
"deleting function dictionary should raise TypeError"
)
verify
(
c
[
0
]
.
__class__
.
__name__
==
"cell"
)
# don't have a type object handy
cantset
(
f
,
"func_closure"
,
c
)
def
test_unassigned_dict
(
self
):
self
.
assertEqual
(
self
.
b
.
__dict__
,
{})
def
test_empty_cell
():
def
f
():
print
a
def
test_func_as_dict_key
(
self
):
try
:
value
=
"Some string"
f
.
func_closure
[
0
]
.
cell_contents
d
=
{}
except
ValueError
:
d
[
self
.
b
]
=
value
pass
self
.
assertEqual
(
d
[
self
.
b
],
value
)
else
:
raise
TestFailed
,
"shouldn't be able to read an empty cell"
class
FunctionDocstringTest
(
FuncAttrsTest
):
def
test_set_docstring_attr
(
self
):
a
=
12
self
.
assertEqual
(
self
.
b
.
__doc__
,
None
)
self
.
assertEqual
(
self
.
b
.
func_doc
,
None
)
def
test_func_doc
():
docstr
=
"A test method that does nothing"
def
f
():
pass
self
.
b
.
__doc__
=
self
.
f
.
a
.
im_func
.
__doc__
=
docstr
verify
(
f
.
__doc__
is
None
)
self
.
assertEqual
(
self
.
b
.
__doc__
,
docstr
)
verify
(
f
.
func_doc
is
None
)
self
.
assertEqual
(
self
.
b
.
func_doc
,
docstr
)
f
.
__doc__
=
"hello"
self
.
assertEqual
(
self
.
f
.
a
.
__doc__
,
docstr
)
verify
(
f
.
__doc__
==
"hello"
)
self
.
assertEqual
(
self
.
fi
.
a
.
__doc__
,
docstr
)
verify
(
f
.
func_doc
==
"hello"
)
cannot_set_attr
(
self
.
f
.
a
,
"__doc__"
,
docstr
,
AttributeError
)
del
f
.
__doc__
cannot_set_attr
(
self
.
fi
.
a
,
"__doc__"
,
docstr
,
AttributeError
)
verify
(
f
.
__doc__
is
None
)
verify
(
f
.
func_doc
is
None
)
def
test_delete_docstring
(
self
):
f
.
func_doc
=
"world"
self
.
b
.
__doc__
=
"The docstring"
verify
(
f
.
__doc__
==
"world"
)
del
self
.
b
.
__doc__
verify
(
f
.
func_doc
==
"world"
)
self
.
assertEqual
(
self
.
b
.
__doc__
,
None
)
del
f
.
func_doc
self
.
assertEqual
(
self
.
b
.
func_doc
,
None
)
verify
(
f
.
func_doc
is
None
)
self
.
b
.
func_doc
=
"The docstring"
verify
(
f
.
__doc__
is
None
)
del
self
.
b
.
func_doc
self
.
assertEqual
(
self
.
b
.
__doc__
,
None
)
def
test_func_globals
():
self
.
assertEqual
(
self
.
b
.
func_doc
,
None
)
def
f
():
pass
verify
(
f
.
func_globals
is
globals
())
def
test_main
():
cantset
(
f
,
"func_globals"
,
globals
())
test_support
.
run_unittest
(
FunctionPropertiesTest
,
ImplicitReferencesTest
,
ArbitraryFunctionAttrTest
,
FunctionDictsTest
,
def
test_func_name
():
FunctionDocstringTest
)
def
f
():
pass
verify
(
f
.
__name__
==
"f"
)
if
__name__
==
"__main__"
:
verify
(
f
.
func_name
==
"f"
)
test_main
()
f
.
__name__
=
"g"
verify
(
f
.
__name__
==
"g"
)
verify
(
f
.
func_name
==
"g"
)
f
.
func_name
=
"h"
verify
(
f
.
__name__
==
"h"
)
verify
(
f
.
func_name
==
"h"
)
cantset
(
f
,
"func_globals"
,
1
)
cantset
(
f
,
"__name__"
,
1
)
# test that you can access func.__name__ in restricted mode
s
=
"""def f(): pass
\n
f.__name__"""
exec
s
in
{
'__builtins__'
:{}}
def
test_func_code
():
a
=
b
=
24
def
f
():
pass
def
g
():
print
12
def
f1
():
print
a
def
g1
():
print
b
def
f2
():
print
a
,
b
verify
(
type
(
f
.
func_code
)
is
types
.
CodeType
)
f
.
func_code
=
g
.
func_code
cantset
(
f
,
"func_code"
,
None
)
# can't change the number of free vars
cantset
(
f
,
"func_code"
,
f1
.
func_code
,
exception
=
ValueError
)
cantset
(
f1
,
"func_code"
,
f
.
func_code
,
exception
=
ValueError
)
cantset
(
f1
,
"func_code"
,
f2
.
func_code
,
exception
=
ValueError
)
f1
.
func_code
=
g1
.
func_code
def
test_func_defaults
():
def
f
(
a
,
b
):
return
(
a
,
b
)
verify
(
f
.
func_defaults
is
None
)
f
.
func_defaults
=
(
1
,
2
)
verify
(
f
.
func_defaults
==
(
1
,
2
))
verify
(
f
(
10
)
==
(
10
,
2
))
def
g
(
a
=
1
,
b
=
2
):
return
(
a
,
b
)
verify
(
g
.
func_defaults
==
(
1
,
2
))
del
g
.
func_defaults
verify
(
g
.
func_defaults
is
None
)
try
:
g
()
except
TypeError
:
pass
else
:
raise
TestFailed
,
"shouldn't be allowed to call g() w/o defaults"
def
test_func_dict
():
def
f
():
pass
a
=
f
.
__dict__
b
=
f
.
func_dict
verify
(
a
==
{})
verify
(
a
is
b
)
f
.
hello
=
'world'
verify
(
a
==
{
'hello'
:
'world'
})
verify
(
f
.
func_dict
is
a
is
f
.
__dict__
)
f
.
func_dict
=
{}
verify
(
not
hasattr
(
f
,
"hello"
))
f
.
__dict__
=
{
'world'
:
'hello'
}
verify
(
f
.
world
==
"hello"
)
verify
(
f
.
__dict__
is
f
.
func_dict
==
{
'world'
:
'hello'
})
cantset
(
f
,
"func_dict"
,
None
)
cantset
(
f
,
"__dict__"
,
None
)
def
test_im_class
():
class
C
:
def
foo
(
self
):
pass
verify
(
C
.
foo
.
im_class
is
C
)
verify
(
C
()
.
foo
.
im_class
is
C
)
cantset
(
C
.
foo
,
"im_class"
,
C
)
cantset
(
C
()
.
foo
,
"im_class"
,
C
)
def
test_im_func
():
def
foo
(
self
):
pass
class
C
:
pass
C
.
foo
=
foo
verify
(
C
.
foo
.
im_func
is
foo
)
verify
(
C
()
.
foo
.
im_func
is
foo
)
cantset
(
C
.
foo
,
"im_func"
,
foo
)
cantset
(
C
()
.
foo
,
"im_func"
,
foo
)
def
test_im_self
():
class
C
:
def
foo
(
self
):
pass
verify
(
C
.
foo
.
im_self
is
None
)
c
=
C
()
verify
(
c
.
foo
.
im_self
is
c
)
cantset
(
C
.
foo
,
"im_self"
,
None
)
cantset
(
c
.
foo
,
"im_self"
,
c
)
def
test_im_dict
():
class
C
:
def
foo
(
self
):
pass
foo
.
bar
=
42
verify
(
C
.
foo
.
__dict__
==
{
'bar'
:
42
})
verify
(
C
()
.
foo
.
__dict__
==
{
'bar'
:
42
})
cantset
(
C
.
foo
,
"__dict__"
,
C
.
foo
.
__dict__
)
cantset
(
C
()
.
foo
,
"__dict__"
,
C
.
foo
.
__dict__
)
def
test_im_doc
():
class
C
:
def
foo
(
self
):
"hello"
verify
(
C
.
foo
.
__doc__
==
"hello"
)
verify
(
C
()
.
foo
.
__doc__
==
"hello"
)
cantset
(
C
.
foo
,
"__doc__"
,
"hello"
)
cantset
(
C
()
.
foo
,
"__doc__"
,
"hello"
)
def
test_im_name
():
class
C
:
def
foo
(
self
):
pass
verify
(
C
.
foo
.
__name__
==
"foo"
)
verify
(
C
()
.
foo
.
__name__
==
"foo"
)
cantset
(
C
.
foo
,
"__name__"
,
"foo"
)
cantset
(
C
()
.
foo
,
"__name__"
,
"foo"
)
def
testmore
():
test_func_closure
()
test_empty_cell
()
test_func_doc
()
test_func_globals
()
test_func_name
()
test_func_code
()
test_func_defaults
()
test_func_dict
()
# Tests for instance method attributes
test_im_class
()
test_im_func
()
test_im_self
()
test_im_dict
()
test_im_doc
()
test_im_name
()
testmore
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment