Hab mit
http://wiki.python.de/755%20-%3E%20rwxr-xr-x nochmal angesehen.
Was soll ich sagen, alle drei Beispiele funktionieren nicht wirklich:
Code: Alles auswählen
def symbolic_notation1(mode):
"""
>>> symbolic_notation1(644)
u'rw-r--r--'
>>> symbolic_notation1(40755)
u'rwxr-xr-x'
>>> symbolic_notation1("777")
u'rwxrwxrwx'
"""
return ''.join(
mode & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx')
)
def symbolic_notation2(mode):
"""
>>> symbolic_notation2(644)
u'rw-r--r--'
>>> symbolic_notation2(40755)
u'rwxr-xr-x'
>>> symbolic_notation2("777")
u'rwxrwxrwx'
"""
result = []
for i, x in enumerate('rwxrwxrwx'):
m = mode & 0400 >> i
symbol = m and x or '-'
result.append(symbol)
return ''.join(result)
CHMOD_TRANS_DATA = (
u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx",
)
def symbolic_notation3(mode):
"""
>>> symbolic_notation3(644)
u'rw-r--r--'
>>> symbolic_notation3(40755)
u'rwxr-xr-x'
>>> symbolic_notation3("777")
u'rwxrwxrwx'
"""
mode = mode & 0777 # strip "meta info"
mode_string = u"%o" % mode
return u''.join(CHMOD_TRANS_DATA[int(num)] for num in mode_string)
if __name__ == "__main__":
import doctest
print doctest.testmod(verbose=False)
Ausgaben:
Code: Alles auswählen
...
3 items had failures:
3 of 3 in __main__.symbolic_notation1
3 of 3 in __main__.symbolic_notation2
3 of 3 in __main__.symbolic_notation3
***Test Failed*** 9 failures.
TestResults(failed=9, attempted=9)
Meine Aktuelle Lösung, die auch funktioniert:
Code: Alles auswählen
CHMOD_TRANS_DATA = (
u"---", u"--x", u"-w-", u"-wx", u"r--", u"r-x", u"rw-", u"rwx"
)
def chmod_symbol(octal_value):
"""
Transform a os.stat().st_octal_value octal value to a symbolic string.
ignores meta infromation like SUID, SGID or the Sticky-Bit.
e.g. 40755 -> rwxr-xr-x
>>> chmod_symbol(644)
u'rw-r--r--'
>>> chmod_symbol(40755)
u'rwxr-xr-x'
>>> chmod_symbol("777")
u'rwxrwxrwx'
"""
octal_value_string = str(octal_value)[-3:] # strip "meta info"
return u''.join(CHMOD_TRANS_DATA[int(num)] for num in octal_value_string)