восьмеричная в строку - неприятности

Я просто не могу понять решение этой проблемы, данное в онлайн-курсе. Я нашел фактический код, который решает эту проблему, но я все еще не понимаю его. Может ли кто-нибудь объяснить мне немного подробнее, почему это делает то, что делает? Я был бы чрезвычайно признателен.

Разрешения файла в системе Linux разделены на три набора по три разрешения: чтение, запись и выполнение для владельца, группы и других. Каждое из трех значений может быть выражено как восьмеричное число, суммирующее каждое разрешение, где 4 соответствует чтению, 2 — записи и 1 — выполнению. Или это может быть написано строкой с использованием букв r, w и x или - когда разрешение не предоставлено. Например: 640 — чтение/запись для владельца, чтение для группы и отсутствие разрешений для остальных; преобразуется в строку, это будет: rw-r----- 755 - чтение/запись/выполнение для владельца и чтение/выполнение для группы и других; преобразуется в строку, это будет: rwxr-xr-x Заполните пробелы, чтобы код преобразовал разрешение в восьмеричном формате в строковый формат. Меня больше всего смущает строка с циклом for - я просто этого не понимаю.

Soultion, который я нашел в Интернете (который работает правильно):

def octal_to_string(octal):
 result = ""
 value_letters = [(4,"r"),(2,"w"),(1,"x")]
 # Iterate over each of the digits in octal
 for i in [int(n) for n in str(octal)]:
    # Check for each of the permissions values
    for value, letter in value_letters:
        if i >= value:
            result += letter
            i -= value
        else:
            result += '-'
 return result
    
print(octal_to_string(755)) # Should be rwxr-xr-x
print(octal_to_string(644)) # Should be rw-r--r--
print(octal_to_string(750)) # Should be rwxr-x---
print(octal_to_string(600)) # Should be rw-------

person KShFL    schedule 11.02.2021    source источник


Ответы (1)


Я уверен, вы уже поняли, что каждая восьмеричная цифра (oit? octit?) соответствует набору разрешений, заданному суммой индивидуальных разрешений.

0 = ---
1 = --x
2 = -w-
3 = -wx
4 = r--
5 = r-x
6 = rw-
7 = rwx

Мы можем получить эту строку, вычитая значение, соответствующее каждому разрешению, из нашей восьмеричной цифры.

(6, '') -> (2, 'r') -> (0, 'rw') -> (0, 'rw-')

Что касается строки цикла, поскольку переменная octal является целым числом из 3 (восьмеричных) цифр, мы сначала преобразуем ее в строку, разделяем каждый символ, чтобы получить отдельные восьмеричные цифры, а затем преобразуем их обратно в целые числа, чтобы мы могли их обработать. Вместо того, чтобы писать отдельный оператор для каждой из операций, мы используем списковое понимание для создания списка восьмеричных цифр, по которым мы будем выполнять цикл.

person Cecil Cox    schedule 11.02.2021