Дата составления с немецкими месячными именами [дубликат]

Почему вы даже беспокоитесь?

Чтобы использовать этот TFunctions.GetInterface, вам нужно:

  • интерфейс
  • ссылку на объект
  • ]

Если у вас есть это, вы можете просто вызвать Supports () напрямую:

  intf: = TFunctions.GetInterface & lt; IMyInterface & gt; (myObject);   

является точно , эквивалентным:

  Поддерживает (IMyInterface, myObject, intf);   

Использование дженериков здесь пустая трата времени и усилий и действительно задает вопрос «Зачем это делать?».

Это просто усложняет чтение (как так как это часто случается с дженериками) и является более громоздким в использовании.

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

  intf: = TFunctions.GetInterface & lt; IMyInterface & gt; (myObject);  Если Assigned (intf), то // ...  

против:

 , если поддерживает (IMyInterface, myObject, intf), то // Мы можем использовать intf   

При создании оберток вокруг функциональности обычно бывает, что результатом является улучшение читабельности или удобства использования.

imho это не работает по обоим пунктам, и вы должны просто придерживаться с самой поддержкой функции Supports ().

22
задан MagerValp 3 September 2013 в 14:43
поделиться

3 ответа

Пример, данный Роб, замечательный, но не является потокобезопасным. Вот версия, которая работает с потоками:

import locale
import threading

from datetime import datetime
from contextlib import contextmanager


LOCALE_LOCK = threading.Lock()

@contextmanager
def setlocale(name):
    with LOCALE_LOCK:
        saved = locale.setlocale(locale.LC_ALL)
        try:
            yield locale.setlocale(locale.LC_ALL, name)
        finally:
            locale.setlocale(locale.LC_ALL, saved)

# Let's set a non-US locale
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

# Example to write a formatted English date
with setlocale('C'):
    print(datetime.now().strftime('%a, %b')) # e.g. => "Thu, Jun"

# Example to read a formatted English date
with setlocale('C'):
    mydate = datetime.strptime('Thu, Jun', '%a, %b')

Создает поточный менеджер контекста, используя глобальную блокировку, и позволяет вам иметь несколько потоков, выполняющих языковой код, используя LOCALE_LOCK. Он также обрабатывает исключения из инструкции yield, чтобы гарантировать, что исходный язык всегда восстанавливается.

25
ответ дан Daniel 16 August 2018 в 14:06
поделиться
  • 1
    Обратите внимание, что для достижения успеха setlocale () вам необходимо установить локаль на системном уровне. На что, вообще говоря, нельзя положиться. Для всего, что означает быть локализуемым, вам нужно держаться подальше от strftime и использовать соответствующую библиотеку i18n, такую ​​как Babel. – ddaa 20 August 2014 в 18:22
  • 2
    это опечатка на saved = locale.setlocale(...? – vonPetrushev 20 October 2014 в 19:57
  • 3
    Я не верю, что есть опечатка - если второй аргумент setlocale - None, вы получите текущую установленную локаль. – Daniel 20 October 2014 в 23:53
  • 4
    @ddaa: Спасибо за это предложение. В самом деле, нельзя полагаться на тех, которые установлены, даже если вы живете в стране, для которой вы пытаетесь использовать локаль. Вавилон - это действительно путь, и это должен быть отдельный ответ. – WhyNotHugo 15 March 2015 в 14:02
  • 5
    Будет ли он yield, если setlocale выбрасывает? Разве это не беспорядок с конструкцией with? (например, преждевременный StopIteration поднят и т. д.) (И BTW - крутой ответ, там много чего происходит. Я думал, что проблема «locale is per process» не может быть отправлена ​​так легко.) – Tomasz Gandor 25 April 2016 в 11:14

взгляните на пакет pytz

, который вы можете использовать следующим образом:

import pytz
UTC = pytz.timezone('UTC') # utc
fr = pytz.timezone('Europe/Paris') #your local
from datetime import datetime
date = datetime.now(fr)
dateUTC = date.astimezone(UTC)

strftime будет отображаться в указанном часовом поясе

для названия месяца в языковой версии calendar , например:

import calendar
print calendar.month_name[dateUTC.month] #will print in the locale

проверить более глубокий календарь для получения дополнительной информации

-3
ответ дан Philippe T. 16 August 2018 в 14:06
поделиться
  • 1
    Это интересно, но мне нужно создать отметку даты с английскими словами в будние дни (% a) и месяцы (% b), не изменяя часовой пояс. Может ли pytz сделать это тоже? – MagerValp 3 September 2013 в 14:43
  • 2
    взгляните на календарь docs.python.org/2/library/calendar.html#module-calendar и метод calendar.month_name, возможно, – Philippe T. 3 September 2013 в 14:47
  • 3
    Опять же, это не то, что хочет OP. calendar.month_name Массив, который представляет месяцы года в текущей локали. – Dima Tisnek 11 March 2015 в 13:14

Нет, нет способа вызвать strftime() с определенной локалью.

Предполагая, что ваше приложение не является многопоточным, сохраните и восстановите существующий язык и установите для вашей локали значение 'C', когда вы вызываете strftime.

#! /usr/bin/python3
import time
import locale


def get_c_locale_abbrev():
  lc = locale.setlocale(locale.LC_TIME)
  try:
    locale.setlocale(locale.LC_TIME, "C")
    return time.strftime("%a-%b")
  finally:
    locale.setlocale(locale.LC_TIME, lc)

# Let's suppose that we're french
locale.setlocale(locale.LC_ALL, 'fr_FR.utf8')

# Should print french, english, then french
print(time.strftime('%a-%b'))
print(get_c_locale_abbrev())
print(time.strftime('%a-%b'))

Если вы предпочитаете with: - try: - finally:, вы можете разбить менеджер контекста:

#! /usr/bin/python3
import time
import locale
import contextlib

@contextlib.contextmanager
def setlocale(*args, **kw):
  saved = locale.setlocale(locale.LC_ALL)
  yield locale.setlocale(*args, **kw)
  locale.setlocale(locale.LC_ALL, saved)

def get_c_locale_abbrev():
  with setlocale(locale.LC_TIME, "C"):
    return time.strftime("%a-%b")

# Let's suppose that we're french
locale.setlocale(locale.LC_ALL, 'fr_FR.utf8')

# Should print french, english, then french
print(time.strftime('%a-%b'))
print(get_c_locale_abbrev())
print(time.strftime('%a-%b'))
]
12
ответ дан Robᵩ 16 August 2018 в 14:06
поделиться
  • 1
    это язык во всем скрипте, я думаю, что будьте осторожны – Philippe T. 3 September 2013 в 14:56
  • 2
    Да, locale.setlocale() влияет на всю программу. Блок try-finally или блок with устанавливает и восстанавливает локаль, чтобы не нарушать остальную часть программы. – Robᵩ 3 September 2013 в 15:22
Другие вопросы по тегам:

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