بايثون:الطريقة الأكثر اصطلاحية لتحويل لا شيء إلى سلسلة فارغة؟

StackOverflow https://stackoverflow.com/questions/1034573

  •  06-07-2019
  •  | 
  •  

سؤال

ما هي الطريقة الأكثر اصطلاحية للقيام بما يلي؟

def xstr(s):
    if s is None:
        return ''
    else:
        return s

s = xstr(a) + xstr(b)

تحديث: أنا أدمج اقتراح Tryptich لاستخدام str(s)، مما يجعل هذا الروتين يعمل مع أنواع أخرى إلى جانب السلاسل.لقد تأثرت بشدة باقتراح لامدا الذي قدمه فيناي ساجيب، لكني أريد أن أبقي الكود الخاص بي بسيطًا نسبيًا.

def xstr(s):
    if s is None:
        return ''
    else:
        return str(s)
هل كانت مفيدة؟

المحلول

إذا كنت تريد بالفعل أن تتصرف وظيفتك مثل str() مضمن، ولكن قم بإرجاع سلسلة فارغة عندما تكون الوسيطة بلا، قم بذلك:

def xstr(s):
    if s is None:
        return ''
    return str(s)

نصائح أخرى

def xstr(s):
    return '' if s is None else str(s)

إذا كنت تعلم أن القيمة ستكون دائمًا إما سلسلة أو لا شيء:

xstr = lambda s: s or ""

print xstr("a") + xstr("b") # -> 'ab'
print xstr("a") + xstr(None) # -> 'a'
print xstr(None) + xstr("b") # -> 'b'
print xstr(None) + xstr(None) # -> ''

ربما سيكون الأقصرstr(s or '')

لأن لا شيء خطأ، و"x أو y" ترجع y إذا كانت x خاطئة.يرى العوامل المنطقية للحصول على شرح مفصل.إنها قصيرة، ولكنها ليست صريحة جدًا.

return s or '' سوف تعمل بشكل جيد لمشكلتك المعلنة!

def xstr(s):
   return s or ""

الطريقة الوظيفية (بطانة واحدة)

xstr = lambda s: '' if s is None else s
def xstr(s):
    return {None:''}.get(s, s)

الاختلاف على ما ورد أعلاه إذا كنت تريد أن تكون متوافقًا مع Python 2.4

xstr = lambda s: s is not None and s or ''

أستخدم الوظيفة القصوى:

max(None, '')  #Returns blank
max("Hello",'') #Returns Hello

يعمل مثل السحر؛) فقط ضع السلسلة في المعلمة الأولى للوظيفة.

سطر واحد أنيق للقيام بهذا البناء على بعض الإجابات الأخرى:

s = (lambda v: v or '')(a) + (lambda v: v or '')(b)

أو حتى فقط:

s = (a or '') + (b or '')
def xstr(s):
    return s if s else ''

s = "%s%s" % (xstr(a), xstr(b))

يمكننا دائمًا تجنب اختيار النوع في السيناريوهات الموضحة أدناه.

customer = "John"
name = str(customer)
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + name

في المثال أعلاه، إذا كانت قيمة العميل المتغير هي لا شيء، فسيتم إرساله أيضًا أثناء تعيينه إلى "الاسم".ستفشل المقارنة في جملة "if" دائمًا.

customer = "John" # even though its None still it will work properly.
name = customer
if name is None
   print "Name is blank"
else: 
   print "Customer name : " + str(name)

المثال أعلاه سوف يعمل بشكل صحيح.تعد مثل هذه السيناريوهات شائعة جدًا عندما يتم جلب القيم من عنوان URL أو JSON أو XML أو عندما تحتاج القيم إلى مزيد من النوع لأي معالجة.

إذا كان الأمر يتعلق فقط بتنسيق السلاسل، فيمكنك القيام بما يلي:

from string import Formatter

class NoneAsEmptyFormatter(Formatter):
    def get_value(self, key, args, kwargs):
        v = super().get_value(key, args, kwargs)
        return '' if v is None else v

fmt = NoneAsEmptyFormatter()
s = fmt.format('{}{}', a, b)

استخدام تقييم ماس كهربائى:

s = a or '' + b or ''

نظرًا لأن + ليست عملية جيدة جدًا على السلاسل، فمن الأفضل استخدام سلاسل التنسيق:

s = "%s%s" % (a or '', b or '')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top