Краткое описание правил определения объема?

Есть два способа получить время мода, os.path.getmtime () или os.stat (), но ctime не является надежной кросс-платформенной (см. ниже).

os.path.getmtime ()

getmtime ( путь ) Возвращает время последней модификации пути. Возвращаемое значение - это число, указывающее количество секунд с момента (см. Модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.stat_float_times () возвращает True, результатом будет число с плавающей запятой.

os.stat ()

stat ( путь ) Выполните системный вызов stat () по данному пути. Возвращаемое значение - это объект, атрибуты которого соответствуют членам структуры stat, а именно: st_mode (бит защиты), st_ino (номер inode), st_dev (устройство), st_nlink (количество жестких ссылок), st_uid (идентификатор пользователя владельца ), st_gid (идентификатор группы владельца), st_size (размер файла, в байтах), st_atime (время последнего доступа), st_mtime (время последней модификации контента), st_ctime (зависит от платформы, время изменения последних метаданных в Unix или время создания в Windows) :

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

В приведенном выше примере вы должны использовать statinfo.st_mtime или statinfo.st_ctime для получения mtime и ctime соответственно.

441
задан Georgy 24 January 2019 в 09:53
поделиться

5 ответов

На самом деле, краткое правило для разрешения Объема Python, от [1 120] Изучение Python, 3-го. Ed. . (Эти правила характерны для имен переменной, не атрибутов. При ссылке на него без периода эти правила применяются)

Правило LEGB.

L, Локальный — Имена, присвоенные всегда в функции (def или lambda)), и не объявленный глобальным в той функции.

E, функциональные Включением местные жители — Имя в локальном объеме любого и всех статически включающих функций (def или lambda), от внутреннего до внешнего.

G, Глобальный (модуль) — Имена, присвоенные на верхнем уровне файла модуля, или путем выполнения global оператор в def в файле.

B, Встроенный (Python) — Имена, предписанные во встроенном модуле имен: open, range, SyntaxError...

Так, в случае [1 129]

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

для цикла не имеет его собственного пространства имен. В порядке LEGB объемы были бы

L: локальный, в [1 110] (в [1 111], code 4, code5).

E: Вложенная функция, любые функции включения (если целый пример был в другом def)

G: Глобальный. Там какой-либо x были объявлены глобально в модуле (code1)?

B: Любое встроенное x в Python.

x никогда не будет находиться в [1 119] (даже в случаях, где Вы могли бы ожидать, что это будет, видеть ответ Antti или здесь ).

395
ответ дан Community 24 January 2019 в 09:53
поделиться

, Где x найден?

x не найден, поскольку Вы не определили его.:-) можно было найти в (глобальном) code1 или code3 (локальный) при помещении его там.

code2 (участники класса) не видимы для кодирования внутренних методов того же class —  you, обычно получал бы доступ к ним использование сам. code4/code5 (циклы) живут в том же объеме как code3, поэтому если бы Вы записали в x там, то Вы изменили бы x экземпляр, определенный в code3, не делая новое x.

, Python статически ограничен по объему, поэтому при передаче ‘spam’ другому функциональному спаму, будет все еще иметь доступ к globals в модуле, это прибыло из (определенный в code1), и любой другой содержащий объемы (см. ниже). к участникам code2 снова получили бы доступ через сам.

лямбда не отличается от определения, Если Вам использовали лямбду в функции, это совпадает с определением вложенной функции. В Python 2.2 вперед, вложенные объемы доступны. В этом случае можно связать x на любом уровне функционального вложения, и Python возьмет самый внутренний экземпляр:

x= 0
def fun1():
    x= 1
    def fun2():
        x= 2
        def fun3():
            return x
        return fun3()
    return fun2()
print fun1(), x

2 0

fun3 видит экземпляр x от самого близкого, содержащего объем, который является функциональным объемом, связанным с fun2. Но другие x экземпляры, определенные в fun1 и глобально, не затронуты.

Прежде nested_scopes —  in Python пред2.1, и в 2,1, если Вы конкретно не просите функцию с помощью from-future-import —  fun1 и объемы fun2, не видимы к fun3, таким образом, ответ S.Lott содержит, и Вы получили бы глобальный x:

0 0
7
ответ дан bobince 24 January 2019 в 09:53
поделиться

Правила обзора для Python 2.x уже были обрисованы в общих чертах в других ответах. Единственная вещь, которую я добавил бы, состоит в том, что в Python 3.0, существует также понятие нелокального объема (обозначено 'нелокальным' ключевым словом). Это позволяет Вам получать доступ к внешним объемам непосредственно и открывает способность сделать некоторые аккуратные приемы, включая лексические закрытия (без ужасных взломов, включающих изменяемые объекты).

РЕДАКТИРОВАНИЕ: вот PEP с большей информацией об этом.

21
ответ дан Jeremy Cantrell 24 January 2019 в 09:53
поделиться

Python разрешает Ваши переменные с - обычно - три доступные пространства имен.

В любое время во время выполнения, существует по крайней мере три вложенных объема, пространства имен которых непосредственно доступны: самый внутренний объем, который ищется сначала, содержит локальные имена; пространства имен любых функций включения, которые ищутся, начиная с самого близкого объема включения; средний объем, искавший затем, содержит глобальные имена текущего модуля; и наиболее удаленным объемом (искавший в последний раз) является пространство имен, содержащее встроенные имена.

существует две функции: globals и locals, которые показывают Вам содержание два из этих пространств имен.

Пространства имен создаются пакетами, модулями, классами, объектной конструкцией и функциями. Нет никаких других разновидностей пространств имен.

В этом случае, вызов к функции, названной x, должен быть разрешен в локальном пространстве имен или глобальном пространстве имен.

Локальный в этом случае, тело функции метода Foo.spam.

Глобальный - хорошо - глобален.

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

нет никаких других объемов. for оператор (и другие составные операторы как if и try) не создают новые вложенные объемы. Только определения (пакеты, модули, функции, классы и экземпляры объектов.)

Внутренняя часть определение класса, имена являются частью пространства имен класса. code2, например, должен быть квалифицирован именем класса. Обычно Foo.code2. Однако self.code2 будет также работать, потому что объекты Python смотрят на содержание класса как нейтрализация.

объект (экземпляр класса) имеет переменные экземпляра. Эти имена находятся в пространстве имен объекта. Они должны быть квалифицированы объектом. (variable.instance.)

Из метода класса, у Вас есть местные жители и globals. Вы говорите self.variable для выбора экземпляра как пространства имен. Вы отметите, что self аргумент каждой функции членства класса, делая его частью локального пространства имен.

См. Правила , Объема Python Объем Python , Переменный Объем .

11
ответ дан Community 24 January 2019 в 09:53
поделиться

По существу единственной вещью в Python, который представляет новый объем, является функциональное определение. Классы являются чем-то вроде особого случая, в котором что-либо определенное непосредственно в теле помещается в пространство имен класса, но они не непосредственно доступны из методов (или вложенные классы), они содержат.

В Вашем примере существует только 3 объема, где x будет искаться в:

  • объем спама - содержащий все определенное в code3 и code5 (а также code4, Ваша переменная цикла)

  • глобальная область видимости - содержащий все определенное в code1, а также Foo (и безотносительно изменений после него)

  • builtins пространство имен. Что-то вроде особого случая - это содержит различный Python встроенные функции и типы, такие как len () и str (). Обычно это не должно быть изменено никаким пользовательским кодом, поэтому ожидать, что он будет содержать стандартные функции и ничто иное.

[еще 1113] объемы только появляются при представлении вложенной функции (или лямбда) в изображение. Они будут вести себя в значительной степени, как Вы ожидали бы как бы то ни было. Вложенная функция может получить доступ ко всему в локальном объеме, а также чему-либо в объеме функции включения. например,

def foo():
    x=4
    def bar():
        print x  # Accesses x from foo's scope
    bar()  # Prints 4
    x=5
    bar()  # Prints 5

Ограничения:

к Переменным в объемах кроме переменных локальной функции можно получить доступ, но не могут быть восстановлением к новым параметрам без дальнейшего синтаксиса. Вместо этого присвоение создаст новое локальный переменная вместо того, чтобы влиять на переменную в родительском объеме. Например:

global_var1 = []
global_var2 = 1

def func():
    # This is OK: It's just accessing, not rebinding
    global_var1.append(4) 

    # This won't affect global_var2. Instead it creates a new variable
    global_var2 = 2 

    local1 = 4
    def embedded_func():
        # Again, this doen't affect func's local1 variable.  It creates a 
        # new local variable also called local1 instead.
        local1 = 5
        print local1

    embedded_func() # Prints 5
    print local1    # Prints 4

для фактического изменения привязки глобальных переменных из функционального объема, необходимо определить, что переменная глобальна с глобальным ключевым словом. Например:

global_var = 4
def change_global():
    global global_var
    global_var = global_var + 1

В настоящее время нет никакого способа сделать то же для переменных во включении функция , объемы, но Python 3 представляет новое ключевое слово, "nonlocal", который будет действовать похожим способом к глобальному, но для объемов вложенной функции.

148
ответ дан Brian 24 January 2019 в 09:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: