Есть два способа получить время мода, os.path.getmtime () или os.stat (), но ctime не является надежной кросс-платформенной (см. ниже).
getmtime ( путь ) Возвращает время последней модификации пути. Возвращаемое значение - это число, указывающее количество секунд с момента (см. Модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.stat_float_times () возвращает True, результатом будет число с плавающей запятой.
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 соответственно.
На самом деле, краткое правило для разрешения Объема 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 или здесь ).
, Где 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
Правила обзора для Python 2.x уже были обрисованы в общих чертах в других ответах. Единственная вещь, которую я добавил бы, состоит в том, что в Python 3.0, существует также понятие нелокального объема (обозначено 'нелокальным' ключевым словом). Это позволяет Вам получать доступ к внешним объемам непосредственно и открывает способность сделать некоторые аккуратные приемы, включая лексические закрытия (без ужасных взломов, включающих изменяемые объекты).
РЕДАКТИРОВАНИЕ: вот PEP с большей информацией об этом.
Python разрешает Ваши переменные с - обычно - три доступные пространства имен.
В любое время во время выполнения, существует по крайней мере три вложенных объема, пространства имен которых непосредственно доступны: самый внутренний объем, который ищется сначала, содержит локальные имена; пространства имен любых функций включения, которые ищутся, начиная с самого близкого объема включения; средний объем, искавший затем, содержит глобальные имена текущего модуля; и наиболее удаленным объемом (искавший в последний раз) является пространство имен, содержащее встроенные имена.
существует две функции: globals
и locals
, которые показывают Вам содержание два из этих пространств имен.
Пространства имен создаются пакетами, модулями, классами, объектной конструкцией и функциями. Нет никаких других разновидностей пространств имен.
В этом случае, вызов к функции, названной x
, должен быть разрешен в локальном пространстве имен или глобальном пространстве имен.
Локальный в этом случае, тело функции метода Foo.spam
.
Глобальный - хорошо - глобален.
правило состоит в том, чтобы искать вложенные локальные пространства, созданные функциями метода (и определения вложенной функции), затем искать глобальный. Вот именно.
нет никаких других объемов. for
оператор (и другие составные операторы как if
и try
) не создают новые вложенные объемы. Только определения (пакеты, модули, функции, классы и экземпляры объектов.)
Внутренняя часть определение класса, имена являются частью пространства имен класса. code2
, например, должен быть квалифицирован именем класса. Обычно Foo.code2
. Однако self.code2
будет также работать, потому что объекты Python смотрят на содержание класса как нейтрализация.
объект (экземпляр класса) имеет переменные экземпляра. Эти имена находятся в пространстве имен объекта. Они должны быть квалифицированы объектом. (variable.instance
.)
Из метода класса, у Вас есть местные жители и globals. Вы говорите self.variable
для выбора экземпляра как пространства имен. Вы отметите, что self
аргумент каждой функции членства класса, делая его частью локального пространства имен.
См. Правила , Объема Python Объем Python , Переменный Объем .
По существу единственной вещью в Python, который представляет новый объем, является функциональное определение. Классы являются чем-то вроде особого случая, в котором что-либо определенное непосредственно в теле помещается в пространство имен класса, но они не непосредственно доступны из методов (или вложенные классы), они содержат.
В Вашем примере существует только 3 объема, где x будет искаться в:
объем спама - содержащий все определенное в code3 и code5 (а также code4, Ваша переменная цикла)
глобальная область видимости - содержащий все определенное в code1, а также Foo (и безотносительно изменений после него)
builtins пространство имен. Что-то вроде особого случая - это содержит различный Python встроенные функции и типы, такие как len () и str (). Обычно это не должно быть изменено никаким пользовательским кодом, поэтому ожидать, что он будет содержать стандартные функции и ничто иное.
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
", который будет действовать похожим способом к глобальному, но для объемов вложенной функции.